Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OutOfMemory错误_Java_Jvm_Out Of Memory - Fatal编程技术网

Java OutOfMemory错误

Java OutOfMemory错误,java,jvm,out-of-memory,Java,Jvm,Out Of Memory,我看到一个OutOfMemory问题,我不确定是PERM GEN区域还是堆空间。错误消息没有说明哪个区域内存不足 以下是部分堆栈跟踪: 以下是可能对中间性开发人员有用的信息:java.util.zip.ZipFile.open处的java.lang.OutOfMemoryError(本机方法)位于java.util.zip.ZipFile。(ZipFile.java:127)位于java.util.zip.ZipFile。(ZipFile.java:143)位于com..util.interna

我看到一个OutOfMemory问题,我不确定是PERM GEN区域还是堆空间。错误消息没有说明哪个区域内存不足

以下是部分堆栈跟踪: 以下是可能对中间性开发人员有用的信息:java.util.zip.ZipFile.open处的java.lang.OutOfMemoryError(本机方法)位于java.util.zip.ZipFile。(ZipFile.java:127)位于java.util.zip.ZipFile。(ZipFile.java:143)位于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的哪个部分已满


谢谢。

您提供的信息显示,您的PermGen已满99%。你的堆已经满了73%。因此,增加这两个数字一点也不坏

此外,您还可以使用
-XX:+PrintGCDetails
激活垃圾收集器的日志记录,以获取有关JVM如何使用内存的详细信息。另外激活
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:$filename
将日志发送到一个文件,您可以使用或之类的工具轻松分析该文件

此外,您应该考虑在运行时监视应用程序。

此外: 我的一位同事发现了一种聪明的方法,通过gdb可以使heapdump快很多倍:

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 

cat>/tmp/dodump您提供的信息显示,您的PermGen已满99%。你的堆已经满了73%。因此,增加这两个数字一点也不坏

此外,您还可以使用
-XX:+PrintGCDetails
激活垃圾收集器的日志记录,以获取有关JVM如何使用内存的详细信息。另外激活
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:$filename
将日志发送到一个文件,您可以使用或之类的工具轻松分析该文件

此外,您应该考虑在运行时监视应用程序。

此外: 我的一位同事发现了一种聪明的方法,通过gdb可以使heapdump快很多倍:

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 

cat>/tmp/dodump您提供的信息显示,您的PermGen已满99%。你的堆已经满了73%。因此,增加这两个数字一点也不坏

此外,您还可以使用
-XX:+PrintGCDetails
激活垃圾收集器的日志记录,以获取有关JVM如何使用内存的详细信息。另外激活
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:$filename
将日志发送到一个文件,您可以使用或之类的工具轻松分析该文件

此外,您应该考虑在运行时监视应用程序。

此外: 我的一位同事发现了一种聪明的方法,通过gdb可以使heapdump快很多倍:

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 

cat>/tmp/dodump您提供的信息显示,您的PermGen已满99%。你的堆已经满了73%。因此,增加这两个数字一点也不坏

此外,您还可以使用
-XX:+PrintGCDetails
激活垃圾收集器的日志记录,以获取有关JVM如何使用内存的详细信息。另外激活
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:$filename
将日志发送到一个文件,您可以使用或之类的工具轻松分析该文件

此外,您应该考虑在运行时监视应用程序。

此外: 我的一位同事发现了一种聪明的方法,通过gdb可以使heapdump快很多倍:

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 

cat>/tmp/dodump根据堆栈跟踪,
outofmemory错误发生在
ZipFile.open()
本机方法内部。这意味着问题与Java堆大小和PermGen无关。它可能与ZIP缓存有关,后者由JDK库在内部进行malloc'ed或mmap'ed

尝试添加
-Dsun.zip.disableMemoryMapping=true
JVM选项,看看是否有帮助。

正在打开的ZIP文件有多大?

根据堆栈跟踪,
OutOfMemoryError
发生在
ZipFile.open()本机方法内部。这意味着问题与Java堆大小和PermGen无关。它可能与ZIP缓存有关,后者由JDK库在内部进行malloc'ed或mmap'ed

尝试添加
-Dsun.zip.disableMemoryMapping=true
JVM选项,看看是否有帮助。

正在打开的ZIP文件有多大?

根据堆栈跟踪,
OutOfMemoryError
发生在
ZipFile.open()本机方法内部。这意味着问题与Java堆大小和PermGen无关。它可能与ZIP缓存有关,后者由JDK库在内部进行malloc'ed或mmap'ed

尝试添加
-Dsun.zip.disableMemoryMapping=true
JVM选项,看看是否有帮助。

正在打开的ZIP文件有多大?

根据堆栈跟踪,
OutOfMemoryError
发生在
ZipFile.open()本机方法内部。这意味着问题与Java堆大小和PermGen无关。它可能与ZIP缓存有关,后者由JDK库在内部进行malloc'ed或mmap'ed

尝试添加
-Dsun.zip.disableMemoryMapping=true
JVM选项,看看是否有帮助。


打开的ZIP文件有多大?

下面是jmap-heap命令的输出:您使用的是glassfish之类的服务器吗?不,我不是,我正在运行的是java应用程序,PermGen的使用率似乎达到了99.99%,所以请尝试增加。还转储堆并使用来找出内存泄漏的位置。您的应用程序内存也在膨胀。99.99%是当前分配的400MB内存。500米