[讨论] 请教java堆外内存泄漏分析定位方法?

jjshanwei 2012-01-04
   我有一个java应用, 堆最大设为1g, 当运行几天后就会发现java进程的内存消耗会达到7个多G,导致应用挂掉。请教各位高手java堆外内存泄漏分析定位方法。

   谢谢!
william_ai 2012-01-04
堆外内存泄露,一般是系统中使用压缩和 NIO 导致。
具体原因可以用perftools看看。
ningandjin 2012-01-14
你这个问题我好像也遇到过,貌似NIO分配的堆外内存不fullGC的话,收不回来,然后再JVM堆里面只是存一些堆外内存引用的指针很小,在JVM达到fullGC的标准之前,堆外内存已经分配的很恐怖了,我们系统是因为NIO的ByteBuffer分配了很多堆外内存没回收导致的。不过具体的原理我还没搞清楚,等着大大来解释下。
jjshanwei 2012-01-17
jvm是怎样管理堆外分配的内存呢? 求解惑啊?
ningandjin 2012-01-17
看看R大关于这篇贴的回复  http://hllvm.group.iteye.com/group/topic/28866?page=2
RednaxelaFX 2012-01-17
“堆外”这个词太模糊了所以我不建议这样用。“堆”是什么?

一般Java上下文里说的“堆外”有可能指“Java heap”外,也有可能指“GC heap”外。在更一般的上下文里可能会指“C heap”外,或者根本就不用“堆外”这种说法。

JVM自己运行也要用一些空间;进程中其它的代码(非JVM的代码)也有可能申请、使用一些空间。JVM并没有控制到整个进程里所有的内存。

所以“堆外”分配的内存是怎么管理的呢?有很大一部分“堆外”空间根本就不在JVM的管理下。这个问题本身出发点就有偏差。
NIO direct memory是从C heap分配出来的,实际上JVM也不关心这些内存;这是库(class library)的部分关心的,而不是JVM关心的。
free_sundy 2012-05-28
william_ai 写道
堆外内存泄露,一般是系统中使用压缩和 NIO 导致。
具体原因可以用perftools看看。


请问perftools这个工具怎么用呢?
已经生产test_9967.0002.heap文件,怎么统计结果呢?
执行bin/pprof --text $JAVA_HOME/bin/java test_9511.0001.heap
会提示:
The first profile should be a remote form to use /pprof/symbol
Dumping heap profile to /home/user/perftools/test_10352.0001.heap (Exiting)
怎么样才能产生类似这样的结果呢?
Total: 3263.2 MB 
  3145.2  96.4%  96.4%   3145.2  96.4% zcalloc 
    83.8   2.6%  99.0%     83.8   2.6% os::malloc 
    30.0   0.9%  99.9%     30.0   0.9% init 
     2.2   0.1%  99.9%      2.2   0.1% ObjectSynchronizer::omAlloc 
     1.0   0.0% 100.0%   3144.1  96.4% Java_java_util_zip_Deflater_init 
     0.6   0.0% 100.0%      0.7   0.0% readCEN 
Global site tag (gtag.js) - Google Analytics