Ehcache 3 内存大小
Ehcache 3 size in memory
在 Ehcache 2 中,可以使用 calculateInMemorySize() 获取内存中的大小,例如:
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()方法returns-1:
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();
它对内存单元有限的缓存有效。例如当缓存配置为:
CacheConfiguration<Integer, String> config =
CacheConfigurationBuilder.newCacheConfigurationBuilder(
Integer.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(100, MemoryUnit.MB))
.withExpiry(ExpiryPolicy.NO_EXPIRY).build();
这是不可取的,因为必须为缓存配置元素限制,而不是内存限制。
根据下面 Henri 的回答,可以使用 Sizeof.deepSizeOf() 获取内存大小,但是需要了解缓存实现的一些知识以排除不需要的对象,例如:
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
这不可能。通过设计。
当限制为条目时,我们不计算大小。出于性能原因。跟踪大小非常昂贵。
但是,我认为在您的情况下,我会做 sizeof。如果您不经常需要它,只需对缓存执行 sizeof 即可,它会很好地为您提供当前缓存大小。
SizeOf sizeOf = SizeOf.newInstance();
long deepSize = sizeOf.deepSizeOf(cache); // in bytes
在 Ehcache 2 中,可以使用 calculateInMemorySize() 获取内存中的大小,例如:
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()方法returns-1:
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();
它对内存单元有限的缓存有效。例如当缓存配置为:
CacheConfiguration<Integer, String> config =
CacheConfigurationBuilder.newCacheConfigurationBuilder(
Integer.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(100, MemoryUnit.MB))
.withExpiry(ExpiryPolicy.NO_EXPIRY).build();
这是不可取的,因为必须为缓存配置元素限制,而不是内存限制。
根据下面 Henri 的回答,可以使用 Sizeof.deepSizeOf() 获取内存大小,但是需要了解缓存实现的一些知识以排除不需要的对象,例如:
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
这不可能。通过设计。
当限制为条目时,我们不计算大小。出于性能原因。跟踪大小非常昂贵。
但是,我认为在您的情况下,我会做 sizeof。如果您不经常需要它,只需对缓存执行 sizeof 即可,它会很好地为您提供当前缓存大小。
SizeOf sizeOf = SizeOf.newInstance();
long deepSize = sizeOf.deepSizeOf(cache); // in bytes