如何在遗留 java 应用程序上使用 com.opensymphony.oscache 查找内存泄漏

How to find memory leak with com.opensymphony.oscache on legacy java application

我有一个旧的遗留 Java 应用程序,它每周有几次开始变得非常慢,我不得不重新启动 Tomcat。

我检查了 New Relic Top Transactions 和 Error logs,但我找不到问题的根源,似乎 Top transactions 更多的是结果而不是问题的根源。

所以,我想这可能是内存泄漏,我进行了堆转储并尝试在 Eclipse Memory Analyzer 上对其进行分析,但我很难识别内存泄漏以及它是否真的是内存泄漏。

它接缝问题怀疑 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

我建议使用 YourKit Java Profiler 的试用版,它将为您提供有关遗留应用程序代码的更多详细信息。 这是 link :我在 2014 年使用这个工具作为试用版来检测基于 struts 2 和 Hibernate 的 Web 应用程序中的内存泄漏。

Your Kit