我们在生产服务器中遇到了JVM堆问题。当我们进行堆转储并分析报告时,我们发现超过80%的堆大小被Ehcache对象耗尽,服务器变慢。我们怀疑内存泄漏或累积缓存对象而不清除旧缓存。该站点的站点数量非常大,因此缓存的数量会增加。
我想查看此配置的含义,并建议是否与此问题有关:
<ehcache>
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="10" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
<cache name="name1" maxElementsInMemory="50" eternal="false" overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="86400" />
<cache name="name2" maxElementsInMemory="50" eternal="false" overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="86400" />
<cache name="name3" maxElementsInMemory="50000" eternal="true" overflowToDisk="true"/>
<cache name="name4" maxElementsInMemory="500" eternal="true" overflowToDisk="true"/>
<cache name="name5" maxElementsInMemory="500" eternal="true" overflowToDisk="true"/>
<cache name="name6" maxElementsInMemory="50000" eternal="true" overflowToDisk="true"/>
<cache name="name7" maxElementsInMemory="50000" eternal="true" overflowToDisk="true"/>
</ehcache>
在Java类中,我有以下实现:
@Cacheable("name6")
public ServiceResponse getQualifiedProducts(
ValueObject parameterObject, List < Input > list)
{
return cachedService.getQualifiedProducts(parameterObject, list);
}
任何建议都会很感激。
更新:overflowToDisk =“true”的意义是什么。我没有配置任何磁盘存储。它将如何影响性能?
答案 0 :(得分:1)
您提供的缓存内容示例是ServiceResponse
对象。
你知道那个物体有多大吗?它是否包含对链接到您使用的框架的类型的引用?还是纯商业数据?
这是您需要执行的一种调查,以便了解缓存最终引用的内容以及这会如何影响您的内存使用情况。
作为一般建议,您希望缓存属于您的对象,以便您可以精确控制其大小。
对于overflowToDisk=true
,它将被应用,因为您在共享的xml片段中配置了磁盘存储。
但是虽然它说出了向后依赖性溢出的溢出,但它至少从Ehcache 2.6.0开始就不再像以前那样了。当前的Ehcache模型是所有映射都存在于较慢的存储 - 这里是磁盘 - 以提供更可预测的延迟。当访问映射时,它会被复制到堆中,以便在后续命中时更快地进行检索。