Kat*_*hir 3 java memory heap memory-leaks dump
我一直试图在我的应用程序中找到内存泄漏一周,但没有任何成功.我尝试进行堆转储并使用jhat查看转储并追踪内存泄漏.
这是最好的方法吗?什么是使用堆转储追踪内存泄漏的最佳方法.
感谢您的帮助.
使用的VM: java版"1.6.0_25"Java(TM)SE运行时环境(版本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 Stack trace:无法得到这个.内核因内存不足错误而终止进程.
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]
Run Code Online (Sandbox Code Playgroud)
更新:在检查内核日志消息时,它是一个傻瓜杀手.但仍然为什么系统杀死进程,不是因为进程占用了大量的系统资源(内存).
关于Java的内存泄漏问题是一个重复这个,那个,等.还有,这里有一些想法:
首先按照上面链接的答案中的描述获取一些堆快照.
然后,如果您对整个应用程序了解得很清楚,您可以关注实例计数并找出哪种类型的实例太多了.例如,如果你知道一个类是一个单例,但你在内存中看到该类的100个实例,那么这肯定表明那里有一些有趣的东西.或者,您可以比较快照以查找哪些类型的对象随着时间的推移而增长; 这里的关键是你正在寻找一段时间内的相对增长.
一旦知道泄漏的内容,就会追溯引用以找到无法收集的根引用.
最后,请记住,您可能看到OutOfMemoryError不是因为您正在泄漏内存,而是因为您的堆的某些部分对于应用程序来说太小了.要检查是否是这种情况:
更新:我不确定你的最新更新意味着什么"内核使用内存不足错误导致进程失效",但我认为你可能会说linux内存杀手已被调用.是这样的吗?此问题与java OutOfMemoryError完全分开.对于发生的事情更多的细节,看看从页面我只是挂环节,包括这个和那个.但是问题的解决方案很简单:在服务器上使用更少的内存.我想您可以删除有问题的java进程的最小和最大堆大小,但是您需要确保不会触发真正的Java OutOfMemoryErrors.你能在其他地方移动一些流程吗 你能否将记忆杀手与特定过程的启动联系起来?
| 归档时间: |
|
| 查看次数: |
21139 次 |
| 最近记录: |