我的项目已经开始使用java 7中的java 8。
切换到java 8之后,我们看到一些问题,比如内存消耗随着时间的推移而增加。
以下是我们所做的调查:
现在剩下的唯一路径是分析内存如何分配到java 7和java 8中,特别是私有字节内存中。任何想法或联系在这里将不胜感激。
注意:这个javaw应用程序是一个基于swing的应用程序。
更新1:在使用NMT工具分析了本机内存之后,生成了与基线相比占用的内存的差异。我们发现堆保持不变,但是线程正在泄漏所有这些内存。因此,由于堆中没有任何更改,我假设此泄漏是由于本机代码。。
因此,挑战仍然存在。任何关于的想法,如何分析所有线程占用的内存,在这里都会有所帮助。下面是从本机内存跟踪中获取的快照。
在这张图中,您可以看到在线程中增加了88 MB。竞技场和资源处理数量增加了很多。

在这张图片中,您可以看到73 MB在这个Malloc中增加了。但是这里没有显示方法名。

因此,请抛出一些信息,以了解这两个截图。
发布于 2018-02-23 05:26:50
我遇到了同样的问题。
堆使用常量,只增加元空间,NMT差异显示线程在竞技场分配中使用的内存缓慢但稳定地泄漏。我曾试图通过设置MALLOC_ARENAS_MAX=1 env来修复它,但这并不有效。使用jemalloc/jeprof对本机内存分配进行分析显示,没有可能归因于客户端代码的泄漏,而是指出JDK问题是唯一的冒烟之举,因为malloc调用导致内存泄漏,理论上,这应该是JVM代码造成的。
和您一样,我发现升级JDK解决了问题。我之所以在这里发布答案,是因为我知道它解决了这个问题的原因--它是JDK8 u152:https://bugs.openjdk.java.net/browse/JDK-8164293中修复的一个JDK错误
bug报告提到了类/malloc的增加,而不是Thread/竞技场,但是更深入一点,其中一条评论澄清了错误再现清楚地显示了线程/竞技场中的增加。
发布于 2015-10-22 07:33:44
您可以尝试另一个GC实现,比如在Java7和可能是Java 9中的默认GC中引入的G1。要做到这一点,只需通过以下方式启动Java应用程序:
-XX:+UseG1GCJava8u20中的G1 GC还有一个有趣的功能,可以在堆中查找重复的字符串并“去重复”它们(只有在激活G1时才能工作,而不是使用默认的Java8的GC)。
-XX:+UseStringDeduplication请注意,在进行这样的更改之前,要彻底测试您的系统!
在这里,您可以找到您可以使用的不同GCs的一个很好的描述。
https://stackoverflow.com/questions/32666528
复制相似问题