常见JAVA内存溢出

JVM管理2种内存,堆和非堆,堆启动时候创建,给开发人员用;非堆给JVM自己用,存放类信息,和堆不同,非堆内存运行期间GC不释放。

用到比较多参数有以下

-Xms512m JVM初始堆内存。默认是物理内存的1/64,此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmx512m JVM最大堆内存;默认是物理内存的1/4。

-Xmn256m 堆年轻代大小。

假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了

-XX:PermSize=128M 非堆内存初始值;默认是物理内存的1/64;
-XX:MaxPermSize=256m 非堆内存最大值;默认是物理内存的1/4。

-XX:NewSize=256m 堆年轻代初始值
-XX:MaxNewSize=256m 堆年轻代最大值

这里年轻代可细分为{Eden,from,to},{from,to}也可以定为Survivor区

java对象先在Eden区,如果Eden不够,就试图释放一些不活跃对象,如果还不够,就会将活跃对象放入Survivor区,OLD足够就会将Survivor区对象移到OLD,否则保留在Survivor区。OLD区不够会引发FULL GC。如果FULL GC后,OLD和Survivor区还是不够就会出现out of memory错误。

Xms/Xmx和NewSize/MaxNewSize定义好后,堆OLD区间也自然定义完毕了,即OLD区初始大小=(Xms-NewSize),OLD区最大可占用大小=(Xmx-MaxNewSize)
"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能

(查阅网上资料,有位前辈做了实验发现-Xmn256m相当于-XX:NewSize=256m和-XX:MaxNewSize=256m,http://eyesmore.iteye.com/blog/1530996)

java.lang.OutOfMemoryError: PermGen space

多数非堆內存超过最大值,比如大量引用jar,应用有很多class类,建议调整-XX:MaxPermSize大小。

java.lang.OutOfMemoryError: Javaheap space

堆内存不足,这类情况引起的较多,可能是程序引起,那就需要优化程序,也可以尝试调整-Xms512m和-Xmx512m,还有年轻代大小。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值