Несколько карт хроники в одном приложении, вызывающие длительные паузы GC

#java #caching #chronicle-map #hft

Вопрос:

Я создаю несколько карт хроник, чтобы избежать конфликтов между потоками. У меня есть 10 потоков, которым нужно что-то из кэша. С помощью одного кэша я наблюдал непрерывное увеличение putAll() [размещение 2016 двойных массивов[3][2]) с каждым putAll] раз (до 2,6 секунды). Поэтому я поместил 10 кэшей, избегая конфликтов, сделав так, чтобы ключи в кэше никогда не сталкивались с другим потоком. Паузы GC составили 45 секунд по сравнению с ~ 50 мс при использовании одной карты хроники.

 private final ChronicleMaplt;CharSequence, double[][]gt;[] cache = new ChronicleMap[totalCaches];   for (int i = 0; i lt; totalCaches; i  ) {  try {  cache[i] =  ChronicleMap.of(CharSequence.class, double[][].class)  .entriesPerSegment(1000000)  .averageKeySize(44.0)  .averageValueSize(119.0)  .entries(40320000)  .maxBloatFactor(10.0)  .name(CACHE_NAME.concat(String.valueOf(i)))  .putReturnsNull(true)  .createOrRecoverPersistedTo(  new File(  "/var/opt/cache/"  .concat(CACHE_NAME)  .concat(String.valueOf(i))  .concat(".dat")));  } catch (final IOException e) {  LOGGER.error("GA cache init error", e);  }  }  

Другая проблема заключается в том, что я попытался указать constantValueBySample с помощью объекта double [] [], и это вызвало исключение, указывающее, что размер значения должен быть 119, что не имеет смысла.

 double[][] sample = new double[][]{{Math.random(), Math.random()},  {Math.random(), Math.random()},  {Math.random(), Math.random()}};   for (int i = 0; i lt; totalCaches; i  ) {  try {  cache[i] =  ChronicleMap.of(CharSequence.class, double[][].class)  .entriesPerSegment(1000000)  .averageKeySize(44.0)  .constantValueSizeBySample(sample)  .entries(40320000)  .maxBloatFactor(10.0)  .name(CACHE_NAME.concat(String.valueOf(i)))  .putReturnsNull(true)  .createOrRecoverPersistedTo(  new File(  "/var/opt/cache/"  .concat(CACHE_NAME)  .concat(String.valueOf(i))  .concat(".dat")));  } catch (final IOException e) {  LOGGER.error("GA cache init error", e);  }  }  

Комментарии:

1. Вы решаете несколько проблем в своем вопросе. Stackoverflow не предназначен для поддержки программирования и отладки. Кроме того, ваша фактическая проблема не может быть воспроизведена, так как в коде отсутствует, как на самом деле используется карта. Я предлагаю извлечь вопросы или несколько вопросов, которые соответствуют формату переполнения стека. Например, начните с проблемы разногласий.

2. @cruftex Я не ищу поддержки программирования. Просто хочу понять, поддерживает ли карта хроники несколько экземпляров в одной и той же JVM, почему она ведет себя медленно, когда количество записей на карте увеличивается, и почему она создает исключение размера, когда известно, что константа valuebysample является двойной[3][2]