multithreading - java 8中javaw进程的私有(private)字节增加

标签 multithreading java-8 java-native-interface native java-7

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

切换到 java 8 后,我们看到诸如消耗的内存随着时间的推移而越来越高的问题。

以下是我们所做的调查:

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

  • 现在剩下的唯一途径是分析内存如何分配给 java 7 和 java 8 中的进程,特别是私有(private)字节内存。任何想法或链接将不胜感激。

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

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

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

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

    enter image description here

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

    因此,请提供一些信息来理解这两个屏幕截图。

    最佳答案

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

    堆使用量不变,只有元空间增加,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/

    相关文章:

    使用 HashMap 实现多线程的 Java 单例同步

    java - 如何使用 Java 流在 groupby 之后应用排序和限制

    c# - 异步函数 - 使用主线程拥有的对象进行回调

    java - Spring Boot 中带有@Value 的可选环境变量

    Linux 上的 JavaFX 显示 "Graphics Device initialization failed for : es2, sw"

    java - 如何在 SWIG 生成的 Java 绑定(bind)中转换为 SWIGTYPE_p_void 类型?

    java - 从 Java : Possible ? 调用 WinMain 还有其他方法吗?

    Java Native Access 不执行 C++,对吧?

    c - 面向初学者的 OpenMP

    java - 线程实例新旧java