我的项目已经从 java 7 开始使用 java 8。
切换到 java 8 后,我们看到诸如消耗的内存随着时间的推移而越来越高的问题。
以下是我们所做的调查:
现在剩下的唯一途径是分析内存如何分配给 java 7 和 java 8 中的进程,特别是私有(private)字节内存。任何想法或链接将不胜感激。
注意:这个 javaw 应用程序是一个基于 swing 的应用程序。
更新 1 :使用 NMT 工具分析 native 内存并生成与基线相比占用的内存差异。我们发现堆保持不变,但 线程正在泄漏所有这些内存。因此,由于堆没有变化,我假设此泄漏是由于 native 代码造成的。
所以挑战仍然存在。关于 的任何想法如何分析所有线程占用的内存在这里会有所帮助。
下面是从 native 内存跟踪中获取的快照。
在这张图片中,您可以看到线程增加了 88 MB。竞技场和资源处理数量增加了很多。
在这张图片中,您可以看到这个 Malloc 中增加了 73 MB。但是这里没有显示方法名称。
因此,请提供一些信息来理解这两个屏幕截图。
最佳答案
我遇到了完全相同的问题。
堆使用量不变,只有元空间增加,NMT 差异显示线程使用的内存缓慢但稳定的泄漏,特别是在 arena 分配中。我曾尝试通过设置 MALLOC_ARENAS_MAX=1 环境变量来修复它,但这并不成功。使用 jemalloc/jeprof 分析 native 内存分配显示没有可归因于客户端代码的泄漏,而是指出 JDK 问题是唯一的吸烟枪,因为 malloc 调用导致内存泄漏,理论上应该来自 JVM 代码。
和你一样,我发现升级 JDK 解决了这个问题。我在这里发布答案的原因是因为我知道它解决问题的原因 - 这是在 JDK8 u152 中修复的 JDK 错误:https://bugs.openjdk.java.net/browse/JDK-8164293
错误报告提到了类/malloc 的增加,而不是线程/竞技场,但稍微往下一点的评论澄清了错误再现清楚地显示了线程/竞技场的增加。
关于multithreading - java 8中javaw进程的私有(private)字节增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32666528/