首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java 8中javaw进程的私有字节增加

java 8中javaw进程的私有字节增加
EN

Stack Overflow用户
提问于 2015-09-19 09:28:05
回答 5查看 2.6K关注 0票数 19

我的项目已经开始使用java 7中的java 8。

切换到java 8之后,我们看到一些问题,比如内存消耗随着时间的推移而增加。

以下是我们所做的调查:

  • 问题只有在从java7和java8迁移之后才会出现。
  • 由于metaspace是唯一与内存相关的东西,也就是从hava 7到java 8的变化。我们监视了metaspace,它的增长不会超过20 MB。
  • 堆也保持一致。

现在剩下的唯一路径是分析内存如何分配到java 7和java 8中,特别是私有字节内存中。任何想法或联系在这里将不胜感激。

注意:这个javaw应用程序是一个基于swing的应用程序。

更新1:在使用NMT工具分析了本机内存之后,生成了与基线相比占用的内存的差异。我们发现堆保持不变,但是线程正在泄漏所有这些内存。因此,由于堆中没有任何更改,我假设此泄漏是由于本机代码。

因此,挑战仍然存在。任何关于的想法,如何分析所有线程占用的内存,在这里都会有所帮助。下面是从本机内存跟踪中获取的快照。

在这张图中,您可以看到在线程中增加了88 MB。竞技场和资源处理数量增加了很多。

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

因此,请抛出一些信息,以了解这两个截图。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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/竞技场,但是更深入一点,其中一条评论澄清了错误再现清楚地显示了线程/竞技场中的增加。

票数 2
EN

Stack Overflow用户

发布于 2015-10-22 07:33:44

您可以尝试另一个GC实现,比如在Java7和可能是Java 9中的默认GC中引入的G1。要做到这一点,只需通过以下方式启动Java应用程序:

代码语言:javascript
复制
-XX:+UseG1GC

Java8u20中的G1 GC还有一个有趣的功能,可以在堆中查找重复的字符串并“去重复”它们(只有在激活G1时才能工作,而不是使用默认的Java8的GC)。

代码语言:javascript
复制
-XX:+UseStringDeduplication

请注意,在进行这样的更改之前,要彻底测试您的系统!

在这里,您可以找到您可以使用的不同GCs的一个很好的描述。

票数 5
EN

Stack Overflow用户

发布于 2017-09-14 14:06:28

考虑优化JVM选项

  1. 并行收集器(吞吐量收集器) -XX:+UseParallelGC
  2. 并发收集器(低延迟收集器) -XX:+UseConcMarkSweepGC
  3. 使用字符串重复移除器 -XX:+UseStringDeduplication
  4. 最佳紧凑比 -XXcompactRatio:并参考link1 link2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32666528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档