[讨论] 请教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 |