2013-02-08 68 views
1

我有一个Maven构建似乎偶尔会使Java过程耗尽PermGen内存(EDIT),我从VisualVM了解到,堆和PermGen增加显着每当一个新的建立。现在我想找出泄漏的位置(编辑:而不是只是摆脱偶尔的例外)。当试图找到Maven构建内存泄漏HPROF抱怨

看来标准的方法是让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。

从这里继续下去的最好方法是什么?

+0

你能显示导致问题的pom文件吗?你正在运行单元测试还是集成测试? – khmarbaise 2013-02-08 12:51:46

+0

不幸的是我不能显示有问题的poms。有几个测试,但没有重量。我不相信_this_问题是直接与maven相关的,但也许是Guice,或者我只是试图做一些不受支持的事情。 – 2013-02-08 13:38:59

+0

尝试将'-XX:-HeapDumpOnOutOfMemoryError'添加到'MAVEN_OPTS'。这应该告诉JVM生成内存转储,然后可以通过分析器(如YourKit或VisualVM)进行分析。 – 2013-02-08 16:12:22

回答

0

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

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

我与64位JVM建设时他们personnally使用大项目512米甚至1克。 这些相同的项目需要一半与32位jmvs。

+0

显然我还没有清楚 - 我已经找到解决方法来完成工作。现在我想弄清楚是什么原因,显然有关hprof的问题。 – 2013-02-08 21:18:23