java - HPROF 在尝试查找 Maven 构建内存泄漏时提示

标签 java maven hprof

我有一个 Maven 构建,它偶尔会出现泄漏,导致 Java 进程耗尽 PermGen 内存(编辑),并且我从 VisualVM 了解到,每当构建新进程时,堆和 PermGen 都会显着增加。现在我想找出泄漏在哪里(编辑:而不仅仅是消除偶尔的异常)。

看来解决这个问题的标准方法是让 HPROF 收集数据进行事后分析。然而,这对我来说失败了,并且工具无法正确解析生成的 java.hprof 文件。

我的“mvn.bat”文件看起来像(Windows 7 上的 64 位 JVM):

set JAVA_HOME=c:\Program Files\java\jdk1.7.0_11
C:\Users\TRA\progs\apache-maven-3.0.4\bin\mvn %*

我的 MAVEN_OPTS 看起来像

MAVEN_OPTS=-agentlib:hprof=format=b

这是“mvn clean”的结果。

[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.589s
[INFO] Finished at: Fri Feb 08 12:46:26 CET 2013
[INFO] Final Memory: 8M/154M
[INFO] ------------------------------------------------------------------------
Dumping Java heap ...
HPROF LIST OF ALL FIELDS:
[1] Lsun/reflect/UnsafeFieldAccessorImpl; "field" "Ljava/lang/reflect/Field;"(ty=OBJ) val=[0x00000000,0x500007e0] or [0x00000000,0x500007e0]
[2] Lsun/reflect/UnsafeFieldAccessorImpl; "fieldOffset" "I" (primType=73(I)) val=[0x00000007,0x00000070] or [0x00000007,0x00000070]
[3] Lsun/reflect/UnsafeFieldAccessorImpl; "isFinal" "Z" (primType=90(Z)) val=[0x00000007,0x7ae16501] or [0x00000007,0x7ae16501]
[4] Lsun/reflect/UnsafeStaticFieldAccessorImpl; "base" "Ljava/lang/Object;"(ty=OBJ)
[5] Lsun/reflect/UnsafeQualifiedStaticFieldAccessorImpl; "isReadOnly" "Z" (primType=90(Z))

FOLLOW REFERENCES RETURNED:
[1]: flavor=1, refKind=2, primType=0, object_index=0x500007e0, length=-1, next=0xb0013852
[2]: flavor=2, refKind=2, primType=73, object_index=0x0, length=-1, next=0xb0013851
[3]: flavor=2, refKind=2, primType=90, object_index=0x0, length=-1, next=0xb0013850
[4]: flavor=2, refKind=2, primType=90, object_index=0x0, length=-1, next=0x0

PROBLEM WITH:
[4] Lsun/reflect/UnsafeStaticFieldAccessorImpl; "base" "Ljava/lang/Object;" (primType=0( ), got 90(Z)) val=[0x00000007,0x7ae16501] or [0x00000000,0x00000000]

HPROF ERROR: Trouble with fields and heap data [hprof_reference.c:281]

HPROF LIST OF ALL FIELDS:
[1] Lsun/reflect/UnsafeFieldAccessorImpl; "field" "Ljava/lang/reflect/Field;"(ty=OBJ) val=[0x00000000,0x500007e1] or [0x00000000,0x500007e1]
[2] Lsun/reflect/UnsafeFieldAccessorImpl; "fieldOffset" "I" (primType=73(I)) val=[0x00000007,0x00000074] or [0x00000007,0x00000074]
[3] Lsun/reflect/UnsafeFieldAccessorImpl; "isFinal" "Z" (primType=90(Z)) val=[0x00000007,0x7b2c1001] or [0x00000007,0x7b2c1001]
[4] Lsun/reflect/UnsafeStaticFieldAccessorImpl; "base" "Ljava/lang/Object;"(ty=OBJ)
[5] Lsun/reflect/UnsafeQualifiedStaticFieldAccessorImpl; "isReadOnly" "Z" (primType=90(Z))

FOLLOW REFERENCES RETURNED:
[1]: flavor=1, refKind=2, primType=0, object_index=0x500007e1, length=-1, next=0xb0013836
[2]: flavor=2, refKind=2, primType=73, object_index=0x0, length=-1, next=0xb0013835
[3]: flavor=2, refKind=2, primType=90, object_index=0x0, length=-1, next=0xb0013834
[4]: flavor=2, refKind=2, primType=90, object_index=0x0, length=-1, next=0x0

PROBLEM WITH:
[4] Lsun/reflect/UnsafeStaticFieldAccessorImpl; "base" "Ljava/lang/Object;" (primType=0( ), got 90(Z)) val=[0x00000007,0x7b2c1001] or [0x00000000,0x00000000]

HPROF ERROR: Trouble with fields and heap data [hprof_reference.c:281]

HPROF LIST OF ALL FIELDS:
[1] Lsun/reflect/UnsafeFieldAccessorImpl; "field" "Ljava/lang/reflect/Field;"(ty=OBJ) val=[0x00000000,0x5002f4a1] or [0x00000000,0x5002f4a1]
[2] Lsun/reflect/UnsafeFieldAccessorImpl; "fieldOffset" "I" (primType=73(I)) val=[0x00000007,0x00000070] or [0x00000007,0x00000070]
[3] Lsun/reflect/UnsafeFieldAccessorImpl; "isFinal" "Z" (primType=90(Z)) val=[0x00000007,0x7ae16501] or [0x00000007,0x7ae16501]
[4] Lsun/reflect/UnsafeStaticFieldAccessorImpl; "base" "Ljava/lang/Object;"(ty=OBJ)
[5] Lsun/reflect/UnsafeQualifiedStaticFieldAccessorImpl; "isReadOnly" "Z" (primType=90(Z))

FOLLOW REFERENCES RETURNED:
[1]: flavor=1, refKind=2, primType=0, object_index=0x5002f4a1, length=-1, next=0xb0013a4b
[2]: flavor=2, refKind=2, primType=73, object_index=0x0, length=-1, next=0xb0013a4a
[3]: flavor=2, refKind=2, primType=90, object_index=0x0, length=-1, next=0xb0013a49
[4]: flavor=2, refKind=2, primType=90, object_index=0x0, length=-1, next=0x0
<小时/>

(等等)。我对 hprof 不熟悉。

从这里继续下去的最佳方式是什么?

最佳答案

从 32 位 jvm 切换到 64 位 jvm 时的经典问题是 PermGen 异常。

当使用 64 位 JVM 时,您需要更大的 PermGen 大小。 如果需要,请尝试使用类似 MAVEN_OPTS="-XX:MaxPermSize=256m" 或更高的值。

我个人在使用 64 位 jvm 构建大型项目时使用 512m 甚至 1g。 这些相同的项目需要 32 位 jmv 的一半。

关于java - HPROF 在尝试查找 Maven 构建内存泄漏时提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14772084/

相关文章:

java - 从 WSDL 使用 jaxb2-maven-plugin 生成类

java - jvisualvm:卡在 “Loading Heap Dump...” 屏幕上

scala - 使用 hprof 分析 scala for 循环

java - 使用 SQLiteOpenHelper 时出现问题,创建时返回 null,可能是线程问题

java - Gradle无法下载Kotlin存储库

java - Apache Cassandra 3.10 IllegalArgumentException - Murmur3Partitioner 的 token 无效

java - Maven Android 项目不适用于 Java 8

java - 如何使用 hprof 运行 Maven 单元测试

java - 从 JVM fatal error 日志中猜测方法行号

java - 如何将处理 core.jar 添加到 gradle 项目中?