【发布时间】:2011-10-09 00:17:47
【问题描述】:
一周以来,我一直试图在我的应用程序中查找内存泄漏,但没有任何成功。我尝试进行堆转储并使用 jhat 查看转储并追踪内存泄漏。
这是最好的方法吗?使用堆转储跟踪内存泄漏的最佳方法是什么。
感谢您的帮助。
使用的虚拟机: java 版本“1.6.0_25” Java(TM) SE 运行时环境 (build 1.6.0_25-b06) Java HotSpot(TM) 64 位服务器 VM(内部版本 20.0-b11,混合模式)
JVM 选项: -Xmx1600m -XX:+UseParallelGC -XX:MaxPermSize=256m -Xms1600m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -verbose:gc -Xloggc: /tmp/gc.log
OOME 堆栈跟踪: 无法获取此信息。内核因内存不足错误而终止进程。
GC 日志:最后几行
48587.245: [GC [PSYoungGen: 407168K->37504K(476160K)] 506729K->137065K(1568448K), 3.0673560 secs] [Times: user=3.53 sys=0.00, real=3.07 secs]
50318.617: [GC [PSYoungGen: 444224K->37536K(476416K)] 543785K->175177K(1568704K), 3.6635990 secs] [Times: user=3.70 sys=0.00, real=3.67 secs]
50453.841: [GC [PSYoungGen: 70092K->2912K(476672K)] 207734K->178513K(1568960K), 1.0164250 secs] [Times: user=1.29 sys=0.00, real=1.02 secs]
50454.858: [Full GC (System) [PSYoungGen: 2912K->0K(476672K)] [PSOldGen: 175601K->137776K(1092288K)] 178513K->137776K(1568960K) [PSPermGen: 60627K->60627K(74368K)], 2.0082140 secs] [Times: user=2.09 sys=0.00, real=2.01 secs]
52186.496: [GC [PSYoungGen: 407104K->37312K(444416K)] 544880K->175088K(1536704K), 3.3705440 secs] [Times: user=3.93 sys=0.00, real=3.37 secs]
53919.975: [GC [PSYoungGen: 444416K->37536K(476608K)] 582192K->213032K(1568896K), 3.4242980 secs] [Times: user=4.09 sys=0.00, real=3.42 secs]
54056.872: [GC [PSYoungGen: 70113K->2880K(476480K)] 245609K->216320K(1568768K), 0.9691980 secs] [Times: user=1.19 sys=0.00, real=0.97 secs]
54057.842: [Full GC (System) [PSYoungGen: 2880K->0K(476480K)] [PSOldGen: 213440K->99561K(1092288K)] 216320K->99561K(1568768K) [PSPermGen: 60628K->60628K(72320K)], 2.2203320 secs] [Times: user=2.23 sys=0.01, real=2.22 secs]
55796.688: [GC [PSYoungGen: 406976K->37504K(476160K)] 506537K->137065K(1568448K), 3.2680080 secs]
更新:检查内核日志消息后,它是一个 oom-killer。但是系统为什么要杀掉进程,难道不是因为进程占用了大量的系统资源(内存)。
【问题讨论】:
-
链接说的是本机代码,但我会尝试使用 jconsole。
-
您是否尝试在那些可疑的代码部分中使用“打印内存信息”?它可能会有所帮助
-
Java 不会使用超过指定的最大堆大小。您应该将最大堆设置为您的应用程序需要的任何值,然后确保相关服务器可以为 java 进程提供那么多内存。我在下面添加了更多详细信息。
标签: java memory memory-leaks heap-memory dump