Hazelcast FREE_HEAP_PERCENTAGE 政策未按预期运作
Hazelcast FREE_HEAP_PERCENTAGE policy not working as expected
当达到 JVM 上配置的最小空闲堆百分比时,Hazelcast 的 FREE_HEAP_PERCENTAGE
最大大小策略不会逐出映射条目。
下面是一个说明此问题的测试用例。如果测试是 运行 和其他策略类型(包括 USED_HEAP_PERCENTAGE
),它会按预期工作,以便在达到此最大大小时条目被逐出。但是,如果它是 运行 和 FREE_HEAP_PERCENTAGE
,则条目永远不会从映射中逐出,尽管空闲堆百分比超出了允许的百分比(如果 运行 可以确认)以管理中心为例)。
public class HazelcastMaxSizeTest {
private static final String GROUP_NAME = "TEST";
private static final String MAP_NAME = "test";
private static MaxSizeConfig POLICY_THAT_WORKS = new MaxSizeConfig(5, MaxSizeConfig.MaxSizePolicy.USED_HEAP_PERCENTAGE);
private static MaxSizeConfig POLICY_THAT_DOES_NOT_WORK = new MaxSizeConfig(99, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_PERCENTAGE);
public static void main(String[] args) throws Exception {
HazelcastInstance instance = startHazelcast("hazelcast1", POLICY_THAT_DOES_NOT_WORK);
System.out.println("started " + instance.getName());
IMap<Long, byte[]> map = createMap(instance, MAP_NAME);
System.out.println("map size: " + map.size());
instance.shutdown();
}
private static HazelcastInstance startHazelcast(String instanceName, MaxSizeConfig maxSizeConfig) {
MapConfig mapConfig = new MapConfig(MAP_NAME);
mapConfig.setMaxSizeConfig(maxSizeConfig);
mapConfig.setStatisticsEnabled(true);
mapConfig.setEvictionPolicy(EvictionPolicy.LRU);
mapConfig.setMinEvictionCheckMillis(0L);
mapConfig.setBackupCount(1);
Config config = new Config(instanceName);
config.addMapConfig(mapConfig);
config.getManagementCenterConfig().setEnabled(true);
config.getManagementCenterConfig().setUrl("http://localhost:8080/mancenter");
config.getGroupConfig().setName(GROUP_NAME).setPassword(GROUP_NAME);
return Hazelcast.getOrCreateHazelcastInstance(config);
}
private static IMap<Long, byte[]> createMap(HazelcastInstance instance, String mapname) {
IMap<Long, byte[]> map = instance.getMap(mapname);
map.addEntryListener(new EntryEvictedListener<Long, byte[]>() {
@Override
public void entryEvicted(EntryEvent<Long, byte[]> event) {
System.out.println("evicted " + event.getName() + ": " + event.getKey());
}
}, false);
for (long i = 1; i <= 50_000; i++) {
map.set(i, new byte[100]);
if (i % 1000 == 0) {
System.out.println("set " + map.getName() + ": " + i);
}
}
return map;
}
}
经过进一步调试,我想知道 Hazelcast 的 EvictionChecker
may be incorrectly calculating free heap percentage. While debugging, I found that the calculated free heap percentage was greater than 100. It's calculation uses available / total
, but as described here 是否应该是 available / max
?
我的配置或 FREE_HEAP_PERCENTAGE
策略的预期使用有问题吗?或者这是一个 Hazelcast 错误?
规格:Hazelcast 3.6,-Xmx256m
进一步调试后,我发现 FREE_HEAP_PERCENTAGE
策略的意外行为是由于 Hazelcast 计算可用内存时存在错误。此问题已在 Hazelcast 的问题跟踪器中报告为 Issue 7599。
当达到 JVM 上配置的最小空闲堆百分比时,Hazelcast 的 FREE_HEAP_PERCENTAGE
最大大小策略不会逐出映射条目。
下面是一个说明此问题的测试用例。如果测试是 运行 和其他策略类型(包括 USED_HEAP_PERCENTAGE
),它会按预期工作,以便在达到此最大大小时条目被逐出。但是,如果它是 运行 和 FREE_HEAP_PERCENTAGE
,则条目永远不会从映射中逐出,尽管空闲堆百分比超出了允许的百分比(如果 运行 可以确认)以管理中心为例)。
public class HazelcastMaxSizeTest {
private static final String GROUP_NAME = "TEST";
private static final String MAP_NAME = "test";
private static MaxSizeConfig POLICY_THAT_WORKS = new MaxSizeConfig(5, MaxSizeConfig.MaxSizePolicy.USED_HEAP_PERCENTAGE);
private static MaxSizeConfig POLICY_THAT_DOES_NOT_WORK = new MaxSizeConfig(99, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_PERCENTAGE);
public static void main(String[] args) throws Exception {
HazelcastInstance instance = startHazelcast("hazelcast1", POLICY_THAT_DOES_NOT_WORK);
System.out.println("started " + instance.getName());
IMap<Long, byte[]> map = createMap(instance, MAP_NAME);
System.out.println("map size: " + map.size());
instance.shutdown();
}
private static HazelcastInstance startHazelcast(String instanceName, MaxSizeConfig maxSizeConfig) {
MapConfig mapConfig = new MapConfig(MAP_NAME);
mapConfig.setMaxSizeConfig(maxSizeConfig);
mapConfig.setStatisticsEnabled(true);
mapConfig.setEvictionPolicy(EvictionPolicy.LRU);
mapConfig.setMinEvictionCheckMillis(0L);
mapConfig.setBackupCount(1);
Config config = new Config(instanceName);
config.addMapConfig(mapConfig);
config.getManagementCenterConfig().setEnabled(true);
config.getManagementCenterConfig().setUrl("http://localhost:8080/mancenter");
config.getGroupConfig().setName(GROUP_NAME).setPassword(GROUP_NAME);
return Hazelcast.getOrCreateHazelcastInstance(config);
}
private static IMap<Long, byte[]> createMap(HazelcastInstance instance, String mapname) {
IMap<Long, byte[]> map = instance.getMap(mapname);
map.addEntryListener(new EntryEvictedListener<Long, byte[]>() {
@Override
public void entryEvicted(EntryEvent<Long, byte[]> event) {
System.out.println("evicted " + event.getName() + ": " + event.getKey());
}
}, false);
for (long i = 1; i <= 50_000; i++) {
map.set(i, new byte[100]);
if (i % 1000 == 0) {
System.out.println("set " + map.getName() + ": " + i);
}
}
return map;
}
}
经过进一步调试,我想知道 Hazelcast 的 EvictionChecker
may be incorrectly calculating free heap percentage. While debugging, I found that the calculated free heap percentage was greater than 100. It's calculation uses available / total
, but as described here 是否应该是 available / max
?
我的配置或 FREE_HEAP_PERCENTAGE
策略的预期使用有问题吗?或者这是一个 Hazelcast 错误?
规格:Hazelcast 3.6,-Xmx256m
进一步调试后,我发现 FREE_HEAP_PERCENTAGE
策略的意外行为是由于 Hazelcast 计算可用内存时存在错误。此问题已在 Hazelcast 的问题跟踪器中报告为 Issue 7599。