【发布时间】:2018-03-06 13:02:16
【问题描述】:
Java 程序正在 Hadoop 集群中执行。它在执行过程中出现 OutOfMemoryError 并且进程停止。我想分析被杀死的 java 进程的内存和其他细节。 我在哪里可以找到被杀死的进程日志文件? 我使用 sar 实用程序来分析内存,但它只显示系统内存而不是进程内存。
【问题讨论】:
Java 程序正在 Hadoop 集群中执行。它在执行过程中出现 OutOfMemoryError 并且进程停止。我想分析被杀死的 java 进程的内存和其他细节。 我在哪里可以找到被杀死的进程日志文件? 我使用 sar 实用程序来分析内存,但它只显示系统内存而不是进程内存。
【问题讨论】:
您可以使用-XX:ErrorFile=<your location>/hs_err_pid<pid>.log 作为JVM 参数来设置hs_error 文件位置。
【讨论】:
tmp 位置,如/tmp/hadoop-hadoop/mapred/local/userlogs/job_201802111641_0059/attempt_201802111641_0059_r_000001_1/stdout。但问题是tmp 位置经常被清理。
首先,也许您的 JVM 没有为您的应用程序配置足够的堆大小。
也就是说,根据我的经验,我有一点建议。我认为您应该启用这些标志来调查哪些对象占用了太多空间。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=path
第一个标志将在 OOM 异常的情况下转储堆,第二个标志将设置 JVM 保存该转储文件的路径。
获取堆转储文件后,您应该使用内存分析工具 (https://www.eclipse.org/mat/) 来查看可能由应用程序引起的内存泄漏。
此外,测量 GC 过程很重要,您可以使用这些标志来执行此操作。
-XX:+PrintReferenceGC
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -
XX:+PrintTenuringDistribution -XX:+PrintAdaptiveSizePolicy
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -
Xloggc:/some/where/gc.log
GC.log 可以使用这个在线工具进行分析
【讨论】: