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

为什么堆转储的大小小于JVM消耗的大小?

羿宏硕
2023-03-14

我为我的Java web应用程序分配了一个最大值2048M。由于一些内存泄漏,应用程序已经消耗了将近2 GB的分配内存。此时,我已经使用JVisualVM进行了内存转储。在一个实例中,堆转储大小接近>1.5GB,而在另一个实例中,堆转储大小<100 MB。这背后的原因是什么?

共有1个答案

莘钧
2023-03-14

堆不是JVM进程消耗的唯一内存。堆栈、编译的代码和类元数据、GC数据以及应用程序使用的本机库使用的本机内存消耗了内存。进一步解释每一个;

堆栈;应用程序中的每个线程都有自己的堆栈,堆栈大小可以使用-xss开关进行配置。如果您的应用程序有20个线程并且堆栈大小为1 MB;20 mb将由堆栈使用。

编译代码;由JIT编译器生成的本机代码。(来自字节码)

您可以使用NMT JVM特性分析内部JVM本机内存。https://docs.oracle.com/javase/8/docs/technotes/guides/troleshoot/tooldescr007.html

如果你需要更多的信息,也检查这些文章。

https://plumbr.io/blog/memory-leaks/why-does-my-java-process-consum-more-memory-than-xmx
http://hirt.se/blog/?p=401
https://dzone.com/articles/java-8-permgen-metaspace

 类似资料:
  • 我是Java的初学者,刚开始使用Intellij作为我的IDE。 当我使用它时,有时会延迟。 我更改了我的 xms 和 xmx 以获得更大的堆大小(xms = 1024,xmx = 2048),但它抛出了一个错误。 所以,我把它回滚了。 错误消息是这样的:“初始堆大小设置为大于最大堆大小的值”。 有什么问题? 如果可能,如何增加最大堆大小? 我用的是笔记本电脑,它有8GB内存。x64Intelli

  • 我试图使用以下两个命令获取堆转储 jcmd$pid GC.heap_dump /tmp/filename.dump jmap-转储:格式=b,文件=/tmp/filename.dump$pid jcmd产生约300M的文件大小,jmap产生约1.4G的文件大小。为什么这些尺寸不同,我们在jmap中有其他信息吗?我在jcmd中遗漏了一些论点吗? JDK是1.8.0_162 Xms和Xmx是4G

  • 问题内容: 我们正试图在我们的Web应用程序中找到导致大量内存泄漏的元凶。我们在发现内存泄漏方面经验有限,但是我们发现了如何使用Eclipse MAT进行Java堆转储并对其进行分析。 但是,对于我们使用56 / 60GB内存的应用程序,堆转储的大小仅为16GB,而在Eclipse MAT中则更少。 语境 我们的服务器将Ubuntu 14.04上的Wildfly 8.2.0用于我们的Java应用程

  • 我们正试图找到web应用程序中大内存泄漏的罪魁祸首。我们在查找内存泄漏方面的经验相当有限,但我们了解了如何使用创建java堆转储,并在Eclipse mat中对其进行分析。 但是,由于我们的应用程序使用56/60GB内存,堆转储的大小只有16GB,在Eclipse mat中就更少了。 对于我们的java应用程序,我们的服务器使用Ubuntu14.04上的Wildfly8.2.0,其进程使用了95%

  • 我正在使用IntelliJ 2020.1 Ultimate,并且有一个JBoss 7.0.2服务器,我想从IntelliJ运行。 我将其添加为配置: 但是当我尝试启动服务器时,我收到以下错误: IDEA.app/Contents/plugins/Kotlin/lib/jps/kotlin-jps-plugin.jar:/Applications/IntelliJ IDEA.app/Contents

  • 我一直在分析我们服务的Java.lang.OutofMemoryError:Java堆空间,并试图通过Eclipse MAT工具挖掘堆转储。 我们的服务使用8G堆运行,生成的堆转储的大小只有500 MB。