如何在Linux上处理JVM OutOfMemoryError?

时间:2012-03-14 16:00:31

标签: java memory crash jvm memory-leaks

Redhat Enterprise Linux 5.4 32位+ Sun HotSpot JVM 6u5 32位+ JVM设置-Xms1536m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m

JVM崩溃时出现以下错误:

  

java.lang.OutOfMemoryError:为Chunk :: new请求了828752个字节。交换空间?   内部错误(allocation.cpp:218),pid = 21557,tid = 329534352   错误:Chunk :: new

     

java.lang.OutOfMemoryError:在/BUILD_AREA/jdk6_05/hotspot/src/share/vm/utilities/growableArray.cpp中为GrET请求了383504个字节。交换空间?   内部错误(allocation.inline.hpp:42),pid = 16927,tid = 334281616   错误:在/BUILD_AREA/jdk6_05/hotspot/src/share/vm/utilities/growableArray.cpp中填写

     

java.lang.OutOfMemoryError:在/BUILD_AREA/jdk6_05/hotspot/src/share/vm/utilities/growableArray.cpp中为GrET请求了256000个字节。交换空间?   内部错误(allocation.inline.hpp:42),pid = 16863,tid = 334216080   错误:/BUILD_AREA/jdk6_05/hotspot/src/share/vm/utilities/growableArray.cpp中的GrET   ..........

可能是JVM本身的C / C ++核心内存泄漏,C / C ++内存使用量达到JVM临界值,或者平台交换空间不足。

如何处理JVM本身的C / C ++核心内存泄漏?
Valgrind v3.7无法与热点JVM 6u5一起使用。

2 个答案:

答案 0 :(得分:0)

这里的JVM崩溃只是错误的。问题是该过程耗尽了地址空间。您的“-Xmx2048m”对于当前可用的虚拟内存和/或特定的32位O / S来说太大了。

在32位Windows下,任何进程最多只能处理~1.6GB的RAM。 其他OS依赖。 Linux应该能够使用~3GB最大值。

除了对象堆大小(-Xmx)之外,JVM还需要一些用于堆栈,对象管理,gc结构等的RAM。实际上,这会导致32位Windows系统的最大堆大小约为1100MB。 / p>

有关进程内存大小限制的更多详细信息,请参阅例如tis blog post:https://sinewalker.wordpress.com/2007/03/04/32-bit-windows-and-jvm-virtual-memory-limit

答案 1 :(得分:0)

它清楚地说,你的JVM无法分配更多的内存。可用(物理)内存为0,因此您的系统正在使用交换。然后在某些时候,交换将充满交换的内存页面,因此进一步的内存请求(alloc)将失败。

使用

测试交换的使用情况
$ swapon -s 
Filename                Type        Size    Used    Priority
/dev/xvda2              partition   8386556 99312   -1

您可以随时增加交换大小。 See this link