1

FREE_HEAP_PERCENTAGEJVM で構成された空きヒープの最小パーセンテージに達した場合、Hazelcastの最大サイズ ポリシーはマップ エントリを削除しません。

以下は、この問題を示すテスト ケースです。テストが他のポリシー タイプ (を含むUSED_HEAP_PERCENTAGE) で実行される場合、この最大サイズに達したときにエントリが削除されるように期待どおりに動作します。ただし、 を使用して実行するとFREE_HEAP_PERCENTAGE、フリー ヒープのパーセンテージが許可されたパーセンテージを超えているにもかかわらず、エントリがマップから削除されることはありません (たとえば、Management Center を実行している場合に確認できます)。

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;
    }

}

さらにデバッグした後、HazelcastEvictionCheckerが空きヒープのパーセンテージを誤って計算しているのではないかと考えています。デバッグ中に、計算されたフリー ヒープのパーセンテージが 100 を超えていることがわかりました。計算には が使用されますが、ここavailable / totalで説明されているように、代わりにこれを使用する必要がありますか?available / max

FREE_HEAP_PERCENTAGEポリシーの構成または予想される使用法に何か問題がありますか? それともヘーゼルキャストのバグですか?

仕様: ヘーゼルキャスト 3.6、-Xmx256m

4

1 に答える 1

3

さらにデバッグした後、FREE_HEAP_PERCENTAGEポリシーの予期しない動作は、Hazelcast の使用可能なメモリの計算のバグによるものであることがわかりました。この問題は、Hazelcast の問題トラッカーで問題 7599として報告されています。

于 2016-02-24T20:45:56.223 に答える