首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java堆转储和堆分析后的堆大小不同

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

Stack Overflow用户
提问于 2016-12-12 14:36:06
回答 5查看 3.5K关注 0票数 16

我正在经历内存泄漏,下面是一些细节。

在泄密后,

  • 顶部显示50 as内存作为住宅。
  • 堆转储文件大小为25 is。
  • eclipse分析器告诉我堆的大小是10 me。

在泄密前,

  • 顶部显示30 as内存作为住宅。
  • 堆转储文件大小为20 is
  • eclipse分析器告诉我堆的大小是10 me。

我很惊讶顶部、堆转储大小和实际堆大小之间的差别。我猜想顶部和堆之间的区别在于垃圾收集器堆和本机堆区域的可能性。但是,堆转储文件大小和实际堆大小(来自eclipse分析器)为什么会有所不同呢?

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

更新/应答

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

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

因此,在本机库内部发生泄漏时,jcmd不是一个选项。

在爬网几天并试用各种分析器之后,解决此问题的最有效方法是使用jemalloc分析器。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-12-19 07:21:21

top和其他操作系统级工具显示了您的JVM进程消耗了多少系统内存。Java堆是由-Xmx命令行选项定义的,它只是该内存的一部分。除了堆之外,JVM本身还需要一些内存。然后是java线程,每个线程都需要一定数量的内存。和Metaspace/永久一代。还有其他几个。有关更多信息,您可以阅读这篇博客文章这就是答案

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

票数 4
EN

Stack Overflow用户

发布于 2016-12-14 15:55:23

我也经历过类似的情况。这种差异(由MAT表示的堆的HPROF文件大小)实际上是垃圾(不可访问的对象)。无法到达的物体直方图在垫子应该有帮助。

jmap -F -dump:live,format=b,file=<file_name.hprof> <process_id>只会转储活动对象,而不会转储垃圾。

票数 4
EN

Stack Overflow用户

发布于 2016-12-23 10:28:51

为了监视本机内存,需要使用-XX:NativeMemoryTracking=summary-XX:NativeMemoryTracking=detail启动应用程序。请注意,这是一个性能损失,所以在生产之前要三思而后行。

当内存跟踪处于活动状态时,可以使用jcmd <pid> VM.native_memory summary。还有其他命令可用,检查https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html或搜索本机内存跟踪。

编辑:在回答之前,我没有跟踪链接,你可能是在寻找类似https://github.com/jeffgriffith/native-jvm-leaks的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41103220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档