我有一个旧的 Java 应用程序,每周有几次变得非常慢,我必须重新启动 Tomcat。
我检查了 New Relic 的热门事务和错误日志,但找不到问题的根源,看来热门事务更多的是结果而不是问题的根源。
所以,我认为这可能是内存泄漏,我进行了堆转储并尝试在 Eclipse 内存分析器上对其进行分析,但我在识别内存泄漏以及是否确实是内存泄漏方面遇到了困难。
看来问题1是com.opensymphony.oscache.web.ServletCache。
以下是内存分析器的一些结果:
此外,这是 VisualVM 监视器:
谢谢! 任何有关这方面的帮助或指导都会非常有帮助!
这是oscache.properties文件:
cache.memory=true
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener
cache.path=/home/oscache/tb
最佳答案
我建议采取一些措施来解决这个问题。
如果您的用例允许您执行以下操作,请使用磁盘缓存而不是内存缓存:
在oscache的配置文件中
cache.memory=false
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.path=/opt/myapp/cache
cache.capacity=1000
如果不建议使用磁盘缓存尝试减少缓存容量
cache.capacity=1000
如果可能,请提供 oscache 的配置详细信息,以便更好地审查。
更新
当属性 cahce.memory=false 时使用 HashDiskPersistenceListener
我们有两种选择可供尝试
1) 提供缓存容量的值
cache.capacity=1000 #or a value that covers the usecase
2)使缓存使用磁盘持久化
cache.memory=false
关于java - 如何在旧版 Java 应用程序上使用 com.opensymphony.oscache 查找内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42908953/