Onk*_*nki 18 java-native-interface multithreading native java-7 java-8
我的项目已经开始使用java 7中的java 8.
切换到java 8后,我们发现消耗的内存随着时间的推移而越来越高.
以下是我们所做的调查:
现在剩下的唯一途径是分析内存如何在java 7和java 8中进行分发,特别是私有字节内存.任何想法或链接在这里将不胜感激.
注意:此javaw应用程序是基于swing的应用程序.
更新1:使用NMT工具分析本机内存并生成与基线相比占用的内存差异.我们发现堆保持相同但线程正在泄漏所有这些内存.因此Heap没有变化,我假设这个泄漏是由于本机代码.
所以挑战仍然存在.关于如何分析所有线程占用的内存的任何想法在这里都会有所帮助.以下是从本机内存跟踪中获取的快照.
在这张图片中,你可以看到88 MB的线程增加了.竞技场和资源处理数量增加了很多.
在这张图片中你可以看到这个Malloc中增加了73 MB.但是这里没有显示方法名称.

所以请在理解这两个截图时提供一些信息.
小智 5
您可以尝试另外的GC实现,例如Java 7中引入的G1,也可能是Java 9中的默认GC.为此,只需启动Java应用程序:
-XX:+UseG1GC
Run Code Online (Sandbox Code Playgroud)
Java 8u20中的G1 GC还有一个有趣的功能,可以在堆中查找重复的字符串并对其进行"重复数据删除"(这仅在激活G1时有效,而不是使用默认的Java 8的GC).
-XX:+UseStringDeduplication
Run Code Online (Sandbox Code Playgroud)
请注意在进行此类更改之前彻底测试您的系统!
我遇到了完全相同的问题。
堆使用量恒定,仅元空间增加,NMT 差异显示线程使用的内存缓慢但稳定的泄漏,特别是在竞技场分配中。我曾尝试通过设置 MALLOC_ARENAS_MAX=1 环境变量来修复它,但这没有成效。使用 jemalloc/jeprof 分析本机内存分配显示没有可归因于客户端代码的泄漏,而是指向 JDK 问题,因为唯一确凿的证据是由于 malloc 调用而导致内存泄漏,理论上,该内存泄漏应该来自 JVM 代码。
和你一样,我发现升级 JDK 解决了这个问题。我在这里发布答案的原因是因为我知道它修复问题的原因 - 这是 JDK8 u152 中修复的 JDK bug:https://bugs.openjdk.java.net/browse/JDK-8164293
该错误报告提到了类/malloc 的增加,而不是线程/arena 的增加,但进一步向下的一条评论澄清了错误再现清楚地显示了线程/arena 的增加。
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |