JVM设置过大导致无法创建线程应用服务器宕机
金蝶云社区-马瑞琪
马瑞琪
0人赞赏了该文章 2,099次浏览 未经作者许可,禁止转载编辑于2015年06月29日 16:33:30

问题原因: 由于操作系统分配给每个进程的内存是有限制的,譬如32位JDK在linux下内存限制为3G左右,分别分配给java堆、方法区、程序计算器、每个线程的VM栈和本地方法栈。

适用版本:EAS701问题描述:应用服务器server1宕机解决方案
原因分析:1、分析heap dump 文件,没有发现堆内存溢出。分配给heap 的内存为1536m,而宕机时总的heap dump使用的内存才1000m左右,由此可判断不是heap space 不足导致宕机。2、分析javacore 文件,发现有如下信息: 1TISIGINFO Dump Event"systhrow" (00040000) Detail"java/lang/OutOfMemoryError":"Failed to create a thread: retVal-1073741830, errno 12" received 并且1CICMDLINE /data/kingdee701/eas/ibmjdk/bin/java-Xms1536m -Xmx1536m3、查看现场环境,现场操作系统为64位,有16G内存,但JDK是IBM 32位JDK。 现场环境分配给java堆的内存为1536M,因此导致供给JVM的native memory太小,无法创建线程,从而导致native memory oom宕机。解决方法:
由于64位的JDK在内存方面是没有限制的,且现场操作系统为64位linux、16G内存,因此建议将原有的32位JDK更换为64位JDK。关键字JDK 操作系统 native memory oom