Этот код имеет ошибку вырезания и вставки
MapConfig mapConfig1 = new MapConfig(MAP_NAME1);
mapConfig.setMaxSizeConfig(maxSizeConfig);
mapConfig.setStatisticsEnabled(false);
mapConfig.setEvictionPolicy(EvictionPolicy.LRU);
mapConfig.setMinEvictionCheckMillis(0L);
mapConfig.setBackupCount(1);
Должно быть
MapConfig mapConfig1 = new MapConfig(MAP_NAME1);
mapConfig1.setMaxSizeConfig(maxSizeConfig);
mapConfig1.setStatisticsEnabled(false);
mapConfig1.setEvictionPolicy(EvictionPolicy.LRU);
mapConfig1.setMinEvictionCheckMillis(0L);
mapConfig1.setBackupCount(1);
То же самое для mapConfig2
.
Хотя это не помешает выселению первой из трех карт.
Обновление 1: Я могу заставить выселение работать. Вам нужно установить это перед созданием экземпляра Hazelcast, чтобы вместить небольшое количество ключей:
config.setProperty("hazelcast.partition.count", "1");
Затем попробуйте этот код, если вы установите factor
на 2, он работает, и произойдет выселение, установите его на 1 и это не так.
int factor = 2;
byte[] value = new byte[bytes / factor];
for (long i = 1; i <= 10 * factor; i++) {
System.out.println("Write " + i + " size " + value.length + " to " + mapname + " free memory " +
(Runtime.getRuntime().freeMemory() / (1024 * 1024)) + "MB");
map.set(i, value);
}
Однако, когда коэффициент установлен на 1 и -Xmx512m -Xms512m
, я получаю OOME, когда 139 МБ свободно. Это более 20% свободной кучи, поэтому выселение не применимо.
Обновление 2 Я зарегистрировал эту проблему https://github.com/hazelcast/hazelcast/issues/16760 Вы можете получить OOME с большим количеством памяти осталось. Это то, что здесь произошло, выселение не было инициировано, так как объем свободной памяти был выше настроенного на 20%.
Обновление 3 Это проблема G1, см. Проблему Github из-за огромного пространства , Вы можете попробовать настроить, изменить G C или просто создать в 10 раз больше объектов, которые составляют 1/10 размера, и проблема исчезнет.