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

Java堆转储和堆分析后的堆大小不同

富凯风
2023-03-14

我正在经历内存泄漏,这里有一些细节。

在泄漏后,

    null
    null

我很惊讶顶部、堆转储大小和实际堆大小之间的差异。我猜测top和heap之间的区别是垃圾收集器堆和本地堆区域的可能性。但是,为什么堆转储文件大小和实际堆大小(来自eclipse MAT analyzer)会不同呢?

对这个问题有什么见解吗?

更新/回答

一些建议是使用jcmd(https://docs.oracle.com/javase/8/docs/technotes/guides/troleshoot/tooldescr007.html),就像网站告诉“本机内存跟踪”的那样。但是,如果你仔细阅读这一页,你会看到

由于NMT不跟踪非JVM代码的内存分配,您可能必须使用操作系统支持的工具来检测本机代码中的内存泄漏。

因此,在本机库内部出现泄漏的情况下,jcmd不是一个选项。

这个页面帮了我大忙!https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-botte-a-memory-leak/

共有1个答案

胡鸿志
2023-03-14

top和其他OS级工具显示JVM进程消耗了多少系统内存。由-xmx命令行选项定义的Java堆只是该内存的一部分。除了堆之外,JVM还需要一些内存。然后是java线程,每个线程都需要一定的内存。和元数据库/永久生成。和其他几个。您可以阅读这篇博客文章,并回答更多信息。

关于转储文件的大小和实际堆大小,@arnab-biswas的答案肯定是正确的。MAT报告活动对象使用的实际使用堆的大小。但是堆转储包含整个堆,包括垃圾。

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

  • 问题内容: 我有一个HotSpot JVM堆转储,我想分析一下。VM运行时带有,堆转储文件的大小为48 GB。 我什至不会尝试,因为它需要大约五倍的堆内存(在我的情况下为240 GB),而且速度非常慢。 在分析了几个小时的堆转储后,Eclipse MAT崩溃了。 还有哪些其他工具可用于该任务?最好使用一套命令行工具,其中包括一个程序,该程序将堆转储转换为有效的数据结构以进行分析,再结合使用其他几个

  • 我有一个非常奇怪的问题。我有一个30 GB的堆转储,我想在我的笔记本电脑上分析相同的(它有8 GB的内存)。我试着用MAT和IBM堆分析器这样做,但是根据他们的建议,Xmx大小应该超过转储大小。我也试着用MAT的文件分析堆转储,但是收到内存错误。 关于如何成功分析笔记本电脑上的垃圾,有什么建议吗? 提前谢谢!

  • 在使用Java的生产中,我经常遇到一些完全的GC问题,我怀疑内存是由网络库分配来缓冲TCP请求结果的。 我已经在内存使用率很高(大约8GB)时转储了Java堆。我尝试用eclipse MAT分析。hprof文件,该文件大约有8GB。 由于eclipse MAT没有显示完整的堆转储内容,我不知道如何找到应用程序占用这么多内存的原因。

  • 我正在运行一个5节点的卡桑德拉集群,它也恰好在5个节点上运行Solr。我已经摄取并索引了超过十亿个项目,目前此消息一直在控制台上打印; INFO 10:55:54,360无法减少堆使用量,因为没有脏列族INFO 10:56:03,897 GC for ConlumtMarkSweep: 538 ms for 1个集合,使用2733064112;max is 3158310912 WARN 10:5

  • Eclipse Memory Analyser文档称它可以打开IBM便携堆转储文件(*.phd):