JVM: Java HotSpot(TM) Client VM (1.5.0_15-b04, mixed mode, sharing)
operating-system:GNU/Linux(uname -o)
问题描述:
一个java小程序,运行一段时间总是会莫名其妙的down掉,有时运行1天后down掉,有时运行5分钟后down掉,并且程序日志没有任何异常
问题分析:
查看了一下nohup.out
java.lang.OutOfMemoryError: Java heap space
用visualvm查看了一下heap的使用情况
然后进程就down掉了,应该是堆内存不够导致程序挂掉
为什么jvm不带参数运行时堆内存只有60多m?网上说默认堆内存为物理内存的1/64
[123@123 ~]$ free -m
total used free shared buffers cached
Mem: 2023 1961 61 0 7 908
-/+ buffers/cache: 1045 977
Swap: 4063 655 3408
计算下来也不应该是60多m,这块还要研究一下
解决方式:
./java -Xmn100m -Xms400m -Xmx400m ...
然后再观察heap的使用情况
看到heap的使用峰值为200m左右,60多m的heap确实不够用
在运行java程序时一定要带上内存配置
备注:
Xmn设置年轻代大小(整个JVM内存大小=年轻代大小+年老代大小+持久代大小。java垃圾回收是基于代的,故该配置会影响垃圾回收的执行。Sun官方推荐配置为整个堆的3/8。)
Xms设置jvm初始堆内存
Xmx设置jvm最大堆内存
将Xms和Xmx设置为一样的大小即可避免堆自动扩展