堆转储分析需要您注意

Posted

技术标签:

【中文标题】堆转储分析需要您注意【英文标题】:Heap Dump Analysis needs your Attention 【发布时间】:2013-01-04 12:12:44 【问题描述】:

我有一个 weblogic 服务器,它在启动时会引发 OOM 错误。因此我的应用程序运行不正常。

我收集了堆转储[下面的快照],但是我不擅长理解输出。

Image Snap: http://img51.imageshack.us/img51/7470/heapanalysis.jpg

您能否帮助理解我为什么会收到 OOM 错误? 以下是 JVM 参数。

 Starting WLS with line:
 /java -server   -Xms1536m -Xmx1536m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=6 -Xnoclassgc -XX:+DisableExplicitGC -verbose:gc -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError   

以下是日志中看到的错误。

> java.lang.OutOfMemoryError: Java heap space Dumping heap to
> java_pid16660.hprof ...
> 115.814: [GC [1 CMS-initial-mark: 743854K(1048576K)] 743854K(1507328K), 0.0050472 secs]
> 115.819: [CMS-concurrent-mark-start] Heap dump file created [778142756 bytes in 3.935 secs] <Jan 20, 2013 10:56:05 PM PST> <Critical>
> <WorkManager> <BEA-002911> <WorkManager weblogic.kernel.System failed
> to schedule a request due to java.lang.OutOfMemoryError: Java heap 
> space java.lang.OutOfMemoryError: Java heap space
> > <Jan 20, 2013 10:56:05 PM PST> <Critical> <WorkManager> <BEA-002911> <WorkManager weblogic.kernel.System failed to schedule a request due
> to java.lang.ArrayIndexOutOfBoundsExcept ion: 26214404
> java.lang.ArrayIndexOutOfBoundsException: 26214404
>         at weblogic.work.CalendarQueue.add(CalendarQueue.java:39)
>         at weblogic.work.RequestManager.addToPriorityQueue(RequestManager.java:263)
>         at weblogic.work.RequestManager.executeIt(RequestManager.java:235)
>         at weblogic.work.ServerWorkManagerImpl.schedule(ServerWorkManagerImpl.java:142)
>         at weblogic.corba.cos.transactions.RecoveryRegistrar.run(RecoveryRegistrar.java:47)
>         Truncated. see log file for complete stacktrace

【问题讨论】:

通过 Eclipse Memory Analyzer Tool 运行您的 HPROF 堆转储 - 并查找 "Leak Suspect" 报告 - 通常是最好的起点。 【参考方案1】:

我建议您下载Visual VM,安装所有插件,然后在运行 WebLogic 时将其附加到 PID。

您的 HPROF 很难阅读,但如果这些是字节,我在这里看不到问题。

【讨论】:

我无权在 JVM 上执行任何操作,我所能得到的只是堆转储,无论您想以何种方式查看它。我附上了错误,如果有帮助请告诉我? 让有权访问服务器的人为您安装并运行它。不,我帮不了你。【参考方案2】:

由于我对Eclipse Memory Analyzer这个工具比较熟悉,所以我将回答如何通过Eclipse MAT工具分析HPROF文件。

在 Eclipse 中打开 HPROF 文件并完成解析后,如果原因更简单或更明显(对 MAT),它将指向“泄漏嫌疑人报告”中的罪魁祸首线程/网络请求。

如果你不那么幸运,那就这样做:

    点击直方图选项 根据右侧的 Retained Heap 字段对表进行排序 直方图视图显示消耗内存的活动对象表,通常是低级别 HashMaps、Lists 等类。 您的目标是从这些***消费者的树中找到类,直到类 您认为它们是应用程序代码的一部分, 的发起者也是如此 内存猪。如果它是一个网络应用程序,您可能会访问特定用户的 HTTP 请求 这一切都开始了。 选择最上面的Class Name并右键选择“Shortest Path to GC Roots -> exclude 幻像、软、弱引用”。 结果表列出了启动 负责内存中断的线程。此列表为您提供了更窄的字段 您可以分析导致其行为不端的原因。

注意: MAT 本身占用大量内存,因此要解析大小为 b/w 5-8 GB 的 HPROF 文件,您至少需要 8 GB RAM 并设置 MAT 工具的初始化参数通过文件: MemoryAnalyzer.ini 特别是 Xmx 参数,比如 -Xmx6144m

【讨论】:

以上是关于堆转储分析需要您注意的主要内容,如果未能解决你的问题,请参考以下文章

分析巨大的 C# 堆转储(超过 10 GB)

分析大型 Java 堆转储 - 内存错误

深入理解Java虚拟机——虚拟机堆转储快照分析工具(jhat)

深入理解Java虚拟机——虚拟机堆转储快照分析工具(jhat)

您可以从 IBM PHD java 堆转储中提取字符串的值吗?

使用 VisualVm 分析堆转储时出现内存不足错误