JVM核心文件转储的查询

4

一台JVM崩溃并创建了一个JVM核心pid文件。由于我对JMV核心文件没有经验,所以需要帮助解决以下问题。

我收到的错误是:

#
# A fatal error has been detected by the Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?
#
#  Internal Error (allocation.cpp:117), pid=20119, tid=797133728
#  Error: ChunkPool::allocate
#
# JRE version: 6.0_21-b06
# Java VM: Java HotSpot(TM) Server VM (17.0-b16 mixed mode linux-x86 )
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#
And Heap memeory statistics is,

Heap
 PSYoungGen      total 248832K, used 123509K [0x89850000, 0x9efa0000, 0xb42f0000)
  eden space 238656K, 47% used [0x89850000,0x90701918,0x98160000)
  from space 10176K, 99% used [0x98ab0000,0x9949bea0,0x994a0000)
  to   space 56448K, 0% used [0x9b880000,0x9b880000,0x9efa0000)
 PSOldGen        total 699072K, used 404738K [0x342f0000, 0x5eda0000, 0x89850000)
  object space 699072K, 57% used [0x342f0000,0x4ce30870,0x5eda0000)
 PSPermGen       total 29056K, used 28878K [0x302f0000, 0x31f50000, 0x342f0000)
  object space 29056K, 99% used [0x302f0000,0x31f23be8,0x31f50000)

JVM arguments,

VM Arguments:
jvm_args: -Xms1024M -Xmx2048M -verbose:gc -XX:+HeapDumpOnOutOfMemoryError -Xss128k -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintCommandLineFlags -XX:+HeapDumpOnOutOfMemoryError

---------------  S Y S T E M  ---------------

OS:Red Hat Enterprise Linux AS release 4 (Nahant Update 6)

uname:Linux 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686
libc:glibc 2.3.4 NPTL 2.3.4 
rlimit: STACK 10240k, CORE infinity, NPROC 274431, NOFILE 4096, AS infinity
load average:1.32 1.50 1.52

CPU:total 4 (2 cores per cpu, 1 threads per core) family 15 model 65 stepping 3, cmov, cx8, fxsr, mmx, sse, sse2, sse3, mmxext, 3dnow, 3dnowext

Memory: 4k page, physical 16631944k(115380k free), swap 18940592k(18614440k free)

vm_info: Java HotSpot(TM) Server VM (17.0-b16) for linux-x86 JRE (1.6.0_21-b06), built on Jun 22 2010 01:04:46 by "java_re" with gcc 3.2.1-7a (J2SE release)

time: Sat Dec 24 11:09:25 2011
elapsed time: 84994 seconds

根据核心文件中的上述细节,

1)有大约18GB的交换空间可用,为什么会出现“交换空间不足”的错误?这不应该是这样的。只有物理内存非常低,只有约115 MB的可用空间。

2)在16 GB的物理内存中,只有2 GB分配给JVM。但根据统计数据,几乎全部使用了16 GB,只剩下115 MB可用。因此,其他进程也可能占用了内存。我应该在这个方向上检查吗?

3)理想情况下,JVM将创建和处理Java对象,还必须创建自己的本地库对象。JVM自己的本地对象会使用哪种内存?它会在指定的堆限制内分配,还是完全分配在堆外?

如果您能回答上述问题,对于我的理解和分析将非常有帮助。

3个回答

2

您的应用程序只分配了2GB内存,因此如果内存超出此限制,将会出现OOM异常。

jvm_args: -Xms1024M -Xmx2048M --> 这非常重要。


OP并没有遇到OutOfMemoryError——他们并没有耗尽Java堆空间。 - tgdavies

0

很抱歉我找不到更多相关信息的链接,但是你的情况下物理内存被耗尽了,99% 被占用(对象空间),这导致了错误。你可能需要通过最大堆内存参数 -Xmx 增加堆内存分配。


0

当您的虚拟内存用尽时,我曾经见过这个错误。由于您使用的是32位JVM,并且堆大小已接近2GB的限制,您可以使用共享库、线程堆栈和直接内存来使用其余可用地址空间,并获得交换空间不足的错误。

最简单的解决方案是使用64位JVM,完全避免了这个问题。我还建议使用Java 6更新30,因为它有许多修复和性能改进。

顺便说一下,您可以只写以下内容,这与-Xms1024M -Xmx2048M相同

-ms1g -mx2g

64位JVM在最新的JVM中仍将使用32位引用,因此您不应该看到内存消耗的显着增加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接