首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存中的Ehcache 3大小

内存中的Ehcache 3大小
EN

Stack Overflow用户
提问于 2018-10-12 22:12:55
回答 1查看 1.8K关注 0票数 3

在Ehcache 2中,可以使用calculateInMemorySize()获得内存中的大小,例如:

代码语言:javascript
复制
CacheManager manager = CacheManager.create();
Cache cache = new Cache(
    new CacheConfiguration("test", 100)
        .eternal(true)
        .statistics(true));
manager.addCache(cache);

assertEquals(0, cache.calculateInMemorySize());

cache.put(new Element(0, "A"));
cache.put(new Element(1, "B"));
cache.put(new Element(2, "C"));

assertTrue(cache.calculateInMemorySize() > 0);
manager.shutdown();

Ehcache 3.6.1中的等价物是什么?

在下面,getOccupiedByteSize()方法返回-1:

代码语言:javascript
复制
StatisticsService statisticsService = new DefaultStatisticsService();
CacheManager manager = CacheManagerBuilder.newCacheManagerBuilder()
    .using(statisticsService)
    .build(true);

CacheConfiguration<Integer, String> config =
    CacheConfigurationBuilder.newCacheConfigurationBuilder(
        Integer.class, String.class, ResourcePoolsBuilder.heap(100))
            .withExpiry(ExpiryPolicy.NO_EXPIRY)
            .build();

Cache<Integer, String> cache = manager.createCache("test", config);

cache.put(0, "A");
cache.put(1, "B");
cache.put(2, "C");

CacheStatistics stats = statisticsService.getCacheStatistics("test");
TierStatistics heap = stats.getTierStatistics().get("OnHeap");
assertTrue(heap.getOccupiedByteSize() > 0);
manager.close();

它确实适用于内存单元有限的缓存。例如,当缓存配置为:

代码语言:javascript
复制
CacheConfiguration<Integer, String> config =
    CacheConfigurationBuilder.newCacheConfigurationBuilder(
        Integer.class, String.class,
        ResourcePoolsBuilder.newResourcePoolsBuilder().heap(100, MemoryUnit.MB))
            .withExpiry(ExpiryPolicy.NO_EXPIRY).build();

这是不可取的,因为缓存必须配置有元素限制,而不是内存限制。

根据Henri下面的回答,可以使用Sizeof.deepSizeOf()获得内存大小,但是需要对缓存实现的一些知识来排除不想要的对象,例如:

代码语言:javascript
复制
SizeOfFilter ehcache = new SizeOfFilter() {
    @Override
    public Collection<Field> filterFields(Class<?> klazz, Collection<Field> fields) {
        if (EhcacheBase.class.isAssignableFrom(klazz)) {
            for (Field field : fields) {
                if ("store".equals(field.getName())) {
                    return Collections.singletonList(field);
                }
            }
            return Collections.emptyList();
        }
        return fields;
    }

    @Override
    public boolean filterClass(Class<?> klazz) {
        return true;
    }
};

SizeOf sizeOf = SizeOf.newInstance(ehcache);
long size = sizeOf.deepSizeOf(cache);

这里有一个简化它的增强请求:https://github.com/ehcache/ehcache3/issues/2500

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-14 02:55:44

这不可能。是故意的。

当限制是条目时,我们不计算大小。因为表演上的原因。保持尺寸的跟踪是相当昂贵的。

然而,我认为在你的情况下,我会做一个大面积。如果您不经常需要它,只需执行相当大的缓存,它就会给出当前缓存的大小。

代码语言:javascript
复制
SizeOf sizeOf = SizeOf.newInstance();
long deepSize = sizeOf.deepSizeOf(cache); // in bytes
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52787621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档