我正在经历内存泄漏,下面是一些细节。
在泄密后,
在泄密前,
我很惊讶顶部、堆转储大小和实际堆大小之间的差别。我猜想顶部和堆之间的区别在于垃圾收集器堆和本机堆区域的可能性。但是,堆转储文件大小和实际堆大小(来自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/
发布于 2016-12-19 07:21:21
发布于 2016-12-14 15:55:23
我也经历过类似的情况。这种差异(由MAT表示的堆的HPROF文件大小)实际上是垃圾(不可访问的对象)。无法到达的物体直方图在垫子应该有帮助。
jmap -F -dump:live,format=b,file=<file_name.hprof> <process_id>只会转储活动对象,而不会转储垃圾。
发布于 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的东西。
https://stackoverflow.com/questions/41103220
复制相似问题