【发布时间】:2018-03-25 06:22:45
【问题描述】:
最近,我们打开了生产服务器的ehcache jmx接口,并启动了持续监控。
在监控的时候,我们发现一个小对象的缓存似乎有一个上限,大概是100万。
这是监控图,有一个上限。图的y轴是缓存中的ObjectCount,是通过ehcache jmx接口获取的。
我们的缓存设置是这样的:
<cache name="prodStockApiEhCache" maxBytesLocalHeap="200M" overflowToDisk="false" eternal="false" timeToIdleSeconds="240" timeToLiveSeconds="360" memoryStoreEvictionPolicy="LRU" />
缓存管理器级别没有指定配置。
我们的缓存类是这样的:
public class ProductStock {
private long productId;
private int productCount;
private int pickingCount;
private int lackType;
private int areaSale;
//getter and setter....
}
我们研究了ehcache的对象大小估计方法,它使用了google的sizeof-agent.jar。
我们使用 sizeof-agent.jar 进行测试。我们类的实例堆大小约为 40 字节。如果我们乘以 100 万,则等于 40M,远小于我们配置的 200M。
另外,我们搜索了 ehcache(2.8.5) 的源码,并没有发现任何 100 万的限制。另外,我们在eclipse调试模型中检查了ehcachemanager实例的配置,maxEntriesOnHeap为0,表示没有限制。
这是有线的,有没有我们遗漏的信息?监控图的内涵对吗?
【问题讨论】: