当前位置: 首页 > 知识库问答 >
问题:

Java8中javaw进程的私有字节数增加

谷梁承宣
2023-03-14

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

在切换到Java8之后,我们看到了一些问题,比如随着时间的推移,内存消耗越来越高。

以下是我们所做的调查:

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

现在剩下的唯一路径是分析内存如何在java7和java8中分配给进程,特别是私有字节内存。这里的任何想法或链接都将受到赞赏。

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

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

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

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

所以请扔一些信息在理解这2截图。

共有3个答案

韩刚洁
2023-03-14

考虑优化JVM选项

>

  • 并行收集器(吞吐量收集器)

    -XX: UseParallelGC

    并发收集器(低延迟收集器)

    -XX: UseConcMarkSweepGC

    使用字符串重复删除器

    重复数据删除

    优化压缩比

    -XXcompactRatio:参考链接1链接2

  • 唐声
    2023-03-14

    我遇到了完全相同的问题。

    堆使用率不变,只有metaspace增加,NMT差异显示线程在竞技场分配中使用的内存缓慢但稳定地泄漏。我试图通过设置MALLOC_ARENAS_MAX=1 env var来修复它,但没有结果。用jemalloc/jeprof分析本机内存分配时,没有显示可归因于客户端代码的泄漏,而是指向JDK问题,因为唯一确凿的证据是malloc调用导致的内存泄漏,理论上,malloc调用应该来自JVM代码。

    和你一样,我发现升级JDK解决了这个问题。我之所以在这里发布答案,是因为我知道它解决问题的原因——这是JDK8 u152中修复的一个JDK错误:https://bugs.openjdk.java.net/browse/JDK-8164293

    bug报告提到了类/malloc的增加,而不是线程/arena,但有一条评论进一步澄清了bug的复制清楚地显示了线程/arena的增加。

    云洋
    2023-03-14

    您可以尝试另一种GC实现,比如Java7中引入的G1,也可能是Java9中的默认GC。要做到这一点,只需使用以下工具启动Java应用程序

    -XX:+UseG1GC
    

    Java 8u20中的G1 GC还有一个有趣的功能,可以在堆中查找重复的字符串并“消除”它们(这仅在激活G1时有效,而不是使用默认的Java 8 GC)。

    -XX:+UseStringDeduplication
    

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

    在这里你可以找到一个很好的描述不同的地面军事系统,你可以使用

     类似资料:
    • 本文向大家介绍Windows下java、javaw、javaws以及jvm.dll等进程的区别,包括了Windows下java、javaw、javaws以及jvm.dll等进程的区别的使用技巧和注意事项,需要的朋友参考一下 java  ,javaw   和  javaws 的区别: 首先,所有的这些都是java的启动装置,java.exe经常使用,当使用命令行输出到window的时候,会有java

    • 是否有可能使用JPA接口(实体图)急切地加载@*ToOne属性,这些接口使用父实体类中的@LazyToOne、@LazyGroup设置为懒惰,并启用了字节码增强?我正试图急切地使用实体图加载此类属性,但当查询父实体时,它会触发对此类@*ToOne属性的另一个查询。 试图用另一种方法覆盖实体类中的静态获取类型,包括@LazyToOne,它添加了字节码增强功能。 使用Spring 5.1.3、Spri

    • 我也尝试了npm ursa模块,不幸的是没有成功。

    • 当我们尝试使用增量运算符和加法运算符来递增一个字节变量时会发生什么。 请给我来源,我们可以在哪里找到这样的小东西释放?请帮帮我。

    • 我需要一个自定义的WindowFn,或者应该怎么做?

    • 本文向大家介绍Python程序中的私有变量,包括了Python程序中的私有变量的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将学习Python类中的私有变量。 Python没有称为私有变量的概念。但是,大多数Python开发人员都遵循命名约定来告诉变量不是公共变量,而是私有变量。 我们必须以双下划线开头一个变量名称,以将其表示为私有变量(不是真的)。示例:-一,二等..,。 正如我们已