【问题标题】:'top' shows Java program using more memory than Java profiler shows'top' 显示 Java 程序使用的内存比 Java Profiler 显示的多
【发布时间】:2018-01-24 01:15:42
【问题描述】:

当 Linux top 命令显示 Java 进程使用 14GB 内存而 Java 分析显示仅使用 2GB 时,可能的原因是什么?

【问题讨论】:

  • 你可以在运行java时通过提供xms相关参数来改变它。顺便说一句,我认为他们在谈论不同的事情:使用/保留的内存 jvm 和使用的 java 应用程序。
  • Java 分析器的第二张图片显示它只分配了 2.1GB 堆大小,所以 xms 应该无关紧要。
  • 你说得对,我的意思是启动参数会改变top的结果。

标签: java linux memory memory-leaks


【解决方案1】:

您的总内存是结果堆、PermSize 和堆栈大小。

Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

除了这个 JVM 还需要一些空间才能顺利运行。解释here in deatil

【讨论】:

  • 该公式没有考虑到 other 可以在 JVM 中使用大量内存的事物。您从中获得它的文章默认了这一点。
【解决方案2】:

这意味着您的 JVM / Java 应用程序正在使用堆外内存。很多。

  • 可能是内存映射文件。
  • 可能是本机库:不太可能...对于那么多内存。
  • 可能是本地库分配的内存(例如使用malloc)。
  • 可能是大量的 Java 线程,或具有大量线程堆栈的线程。
  • 可能是别的东西...

这可能是某种内存泄漏,但不是堆对象的内存泄漏。

(由于-Xms的理论可能是错误的。如果JVM预先分配了一个巨大的初始堆并且没有使用它,您不会期望有那么多“RES”内存。这是可以想象的 堆已经变得非常大并且已经缩小了,但是 JVM 还没有(还)将空间还给操作系统。但是 AFAIK JVM 将内存释放回操作系统 when 它缩小了堆的大小。)

如果您要深入了解这一点,您需要了解您的应用程序及其库依赖项在做什么。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2012-12-30
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多