当前位置: 首页 > 知识库问答 >
问题:

JVM堆的EhCache缓存配置问题

章乐逸
2023-03-14

我们有一个正式服JVM堆问题。当我们进行堆转储并分析报告时,我们发现超过80%的堆大小被Ehache对象耗尽,服务器变得很慢。我们怀疑内存泄漏或积累缓存对象而没有清除旧缓存。该站点是非常大的容量站点,因此缓存的数量会增加。

我想回顾一下这种配置的含义,并建议这是否与该问题有关:

<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);
    }

任何建议都将不胜感激。

更新:溢出ToDisk="true"的意义是什么。我没有配置任何磁盘存储。它将如何影响性能?

共有1个答案

邢洋
2023-03-14

您给出的缓存内容示例是ServiceResponse对象。你知道那个物体有多大吗?它是否包含对链接到您使用的框架的类型的引用?还是纯粹的商业数据?

这是您需要执行的调查,以便了解缓存最终引用的内容以及这如何影响您的内存使用。

作为一般建议,您希望缓存属于您的对象,以便可以精确控制其大小。

至于overflowToDisk=true,它将被应用,因为您在共享的xml片段中配置了一个磁盘存储。

但是,尽管它说溢出是由于向后依赖的原因,但至少从Ehcache2.6.0开始,它就不再像以前那样工作了。当前的Ehcache模型是,所有映射都存在于较慢的存储区(此处为磁盘)中,以提供更可预测的延迟。当一个映射被访问时,它会被复制到堆中,以便在后续点击时更快地检索。

 类似资料:
  • 缓存的配置在configs/cache目录,目前支持三种缓存,文件缓存(FileCache), memcache缓存(MemoCache), redis缓存(RedisCache). 文件缓存的配置在file.config.php, 只有一个参数 "cache_dir", 表示文件缓存的根目录 memcache缓存配置在memo.config.php, 可以添加多个memcache服务器,配置格式

  • 我有一个项目设置(这里的片段来自我在GitHub https://GitHub . com/ashishmarwal/self-populating-cache-issue上创建的一个演示项目),其中在ehcache配置(ehcache.xml)中声明了一个原始的eh-cache缓存。 然后,Spring bean描述符使用该原始缓存使用CacheEntry Works创建修饰的(SelfPopu

  • 本文将介绍如何使用Apache HTTP Server的缓存功能来加速Web和代理服务,同时避免常见问题和错误配置。 Apache HTTP服务器提供了一系列缓存功能,旨在以各种方式提高服务器的性能。 三态RFC2616 HTTP缓存 及其提供者模块提供智能的HTTP感知缓存。内容本身存储在缓存中,旨在遵守控制内容可缓存性的所有各种HTTP头和选项。针对简单和复杂的缓存配置,可以在其中处理代理内容

  • Nuxt.js 使用 lru-cache 提供组件缓存功能以获得更好的渲染性能。 使用方法 类型: Boolean 或 Object (默认值:false) 如果是一个对象类型,其配置属性可以参考 lru-cache 配置项。 例如 (nuxt.config.js): module.exports = { cache: true // or cache: { max: 1000

  • 我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。

  • 主要问题是EHCAHCE2.6.2是否基于ehcache配置驱逐过期元素;还是我必须按程序驱逐? 在阅读了文档的各个部分(数据寿命和缓存大小)之后,我们将当前配置设置为使用TTI/TTL和CacheManager级别MaxBytesLocalHeap=1024M。在设置了这个之后,我希望ehcache只能使用1GB的堆空间进行缓存,但是从测试(和prodcution)中,我们总是看到JVM堆已经满