0

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

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

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

我是否正确使用 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());
4

1 回答 1

0

这条线是罪魁祸首:

bigList.addAll(bigList);

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

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

于 2019-08-13T15:54:12.140 回答