我看到OutOfMemory问题,我不确定它是PERM GEN区域还是堆空间。错误消息没有说明哪个区域内存不足。
这是部分堆栈跟踪: 以下是可能对BETWEENNESS的开发人员有用的信息:java.util.zip.ZipFile上的java.util.zip.ZipFile.open(Native Method)中的java.lang.OutOfMemoryError。(ZipFile.java:127)at java.util.zip.ZipFile。(ZipFile.java:143)at com..util.internal.ZipFiles.unzip(ZipFiles.java:91) 我在使用jmap -heap命令耗尽内存之前查看了堆空间:
using thread-local object allocation.
Parallel GC with 23 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 31675383808 (30208.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 536870912 (512.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 9762177024 (9309.9375MB)
used = 7286558512 (6949.003707885742MB)
free = 2475618512 (2360.933792114258MB)
74.64071276403028% used
From Space:
capacity = 396230656 (377.875MB)
used = 340623360 (324.84375MB)
free = 55607296 (53.03125MB)
85.96592788620576% used
To Space:
capacity = 398131200 (379.6875MB)
used = 0 (0.0MB)
free = 398131200 (379.6875MB)
0.0% used
PS Old Generation
capacity = 1992163328 (1899.875MB)
used = 1455304512 (1387.8865356445312MB)
free = 536858816 (511.98846435546875MB)
73.05146578825087% used
PS Perm Generation
capacity = 418578432 (399.1875MB)
used = 418567008 (399.1766052246094MB)
free = 11424 (0.010894775390625MB)
99.99727076238844% used }
而且,我已经向JVM提供了以下参数:-XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / tmp /但我看不到任何堆。
我的问题是为什么没有生成堆,我怎么弄清楚JVm的哪个部分已经满了。
感谢。
答案 0 :(得分:3)
您提供的信息表明,您的PermGen已满99%。而你的堆已经满73%了。所以增加两者都不会坏。
此外,您可以使用-XX:+PrintGCDetails
激活垃圾收集器的日志记录,以获取有关JVM如何使用内存的详细信息。另外,激活-XX:+PrintGCTimeStamps
和-XX:+PrintGCDateStamps
。 -Xloggc:$filename
会将日志发送到一个文件,您可以使用IMB PMAT tool或GCViewer轻松分析该文件。
此外,您应该考虑在运行时使用VisualVM来监控您的应用程序。
此外: 我的一位同事找到了一种通过gdb快速获得堆转储的智能方法:
cat > /tmp/dodump <<EOF
gcore jvm.core
detach
quit
EOF
time gdb --batch --command=/tmp/dodump --pid=`pgrep java`
jmap -dump:format=b,file=jvm.hprof `which java` jvm.core
rm jvm.core
gzip -9 jvm.hprof
积分完全归功于他。
答案 1 :(得分:0)
根据堆栈跟踪,OutOfMemoryError
在ZipFile.open()
本机方法中发生。这意味着问题与Java堆大小无关,也与PermGen无关。它可能与ZIP缓存有关,它由JDK库在内部进行malloc'ed或mmap'。
尝试添加-Dsun.zip.disableMemoryMapping=true
JVM选项以查看它是否有帮助
ZIP文件的打开量有多大?