【问题标题】:Out of memory in embedded Hazelcast vs ehCache 3嵌入式 Hazelcast 与 ehCache 3 内存不足
【发布时间】:2019-08-13 13:53:56
【问题描述】:

我已尝试将一些对象放入缓存中。

使用 Hazelcast,当我放置大约 30 个对象时出现内存不足。

但是,使用 ehCache 3,我可以毫无问题地放置 1000 个。

我是否正确使用 Hazelcast?

HAZELCAST:

     Config config = new Config().addCacheConfig(new 
     CacheSimpleConfig().setName("testCache"));
     config.setInstanceName("hzInstanceTest");
     HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);

     List<CaLpgDataRowDto<CaBigNumber>> bigList = lpgDatasource.getDataRows();

     while (bigList.size() <= 5000000)
     {
        bigList.addAll(bigList);
     }

     lpgDatasource.setDataRows(bigList);

     ICacheManager hazelcastCacheManager = instance.getCacheManager();
     ICache<String, CaLpgDataCollectionDto<CaBigNumber>> cache = hazelcastCacheManager.getCache("testCache");

     System.out.println("Free memory before (bytes): " + Runtime.getRuntime().freeMemory());

     for (int i = 0; i < 33 ; i++)
     {
        cache.put("objectTest"+i, lpgDatasource);
     }

     System.out.println("Free memory after  (bytes): " + Runtime.getRuntime().freeMemory());

EHCACHE 3:

    CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
           .withCache("ehInstanceTest",
                 CacheConfigurationBuilder
                       .newCacheConfigurationBuilder(String.class, CaLpgDataCollectionDto.class, ResourcePoolsBuilder
                             .heap(10)))
           .build();

     cacheManager.init();

     Cache<String, CaLpgDataCollectionDto> testCache = cacheManager.createCache("testCache",
           CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, CaLpgDataCollectionDto.class, ResourcePoolsBuilder.heap(1000)));

     List<CaLpgDataRowDto<CaBigNumber>> bigList = lpgDatasource.getDataRows();

     while (bigList.size() <= 5000000)
     {
        bigList.addAll(bigList);
     }

     lpgDatasource.setDataRows(bigList);

     System.out.println("Free memory before (bytes): " + Runtime.getRuntime().freeMemory());

     for (int i = 0; i < 1000 ; i++)
     {
        testCache.put("objectTest"+i,lpgDatasource);
     }

     System.out.println("Free memory after  (bytes): " + Runtime.getRuntime().freeMemory());

【问题讨论】:

    标签: hazelcast ehcache-3


    【解决方案1】:

    这是罪魁祸首:

    bigList.addAll(bigList);
    

    尝试将独特的项目添加到列表中以构建它,而不是将其添加到自身。

    否则,它是一个包含 5,000,000 次引用的列表,对远远少于 5,000,000 个对象的引用。不同的缓存管理器会以不同的方式处理此问题,具体取决于它们是否序列化列表。

    【讨论】:

    • 是的。这是目标。存储一些具有大列表的对象。问题是我是否真的在嵌入式模式下正确使用了 hazzelcast。
    • 有多少个对象?这可能是一个有缺陷的测试。 EhCache 默认是 store-by-reference,Hazelcast 默认是 store-by-value。将 EhCache 更改为 store-by-valuesee 和内存使用情况将相当。
    • 嗨。是的。我正在比较一些缓存技术,以便为我的用例选择最好的。你知道是否可以将 Hazelcast 更改为按引用存储?
    • 它必须是 store-by-value 因为存储通常在不同的 JVM 上。所以这里的问题是默认的序列化器不能识别同一个对象在列表中出现多次并复制它。您可以通过提供自定义序列化程序来解决这个问题。这是否值得取决于您是否需要 Hazelcast 通过 EhCache 提供的额外功能。
    • 其他问题。您是否知道 ehcache 3.8.0 中的一个示例,我可以在其中看到如何将其配置为按值存储?在我的情况下,我们需要一个本地缓存。应用程序和缓存将在同一个 JVM 中。我认为在这种情况下我可以通过引用使用存储。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多