Java中关于OOM的场景及解决方法

1、oom for heap=>例如:java.lang.outofmemoryerror: java heap space

【分析】

此oom是由于jvm中heap的最大值不满足需要,将设置heap的最大值调高即可,参数样例为:-xmx2g

【解决方法】

调高heap的最大值,即-xmx的值调大。2、oom for perm=>例如:java.lang.outofmemoryerror: java perm space

【分析】

此oom是由于jvm中perm的最大值不满足需要,将设置perm的最大值调高即可,参数样例为:-xx:maxpermsize=512m

【解决方法】

调高heap的最大值,即-xx:maxpermsize的值调大。

另外,注意一点,perm一般是在jvm启动时加载类进来,如果是jvm运行较长一段时间而不是刚启动后溢出的话,

很有可能是由于运行时有类被动态加载进来,此时建议用cms策略中的类卸载配置。

如:-xx:+useconcmarksweepgc -xx:+cmsclassunloadingenabled3、oom for gc=>例如:java.lang.outofmemoryerror: gc overhead limit exceeded

【分析】

此oom是由于jvm在gc时,对象过多,导致内存溢出,建议调整gc的策略,在一定比例下开始gc而不要使用默认的策略,或者将新代和老代设置合适的大小,

需要进行微调存活率。

【解决方法】

改变gc策略,在老代80%时就是开始gc,并且将-xx:survivorratio(-xx:survivorratio=8)和-xx:newratio(-xx:newratio=4)设置的更合理。4、oom for native thread created=>例如:java.lang.outofmemoryerror: unable to create new native thread

【分析】

参考如下:

(maxprocessmemory - jvmmemory - reservedosmemory) / (threadstacksize) = number of threads

maxprocessmemory指的是一个进程的最大内存

jvmmemoryjvm内存

reservedosmemory保留的操作系统内存

threadstacksize线程栈的大小

如果jvm内存调的过大或者可利用率小于20%,可以建议将heap及perm的最大值下调,并将线程栈调小,即-xss调小,如:-xss128k

【解决方法】

在jvm内存不能调小的前提下,将-xss设置较小,如:-xss:128k

5、oom for allocate huge array=>例如:exception in thread "main": java.lang.outofmemoryerror: requested array size exceeds vm limit

【分析】

此类信息表明应用程序(或者被应用程序调用的apis)试图分配一个大于堆大小的数组。例如,如果应用程序new一个数组对象,大小为512m,但是最大堆大小为256m,因此outofmemoryerror会抛出,因为数组的大小超过虚拟机的限制。

【解决方法】

(1)、首先检查heap的-xmx是不是设置的过小

(2)、如果heap的-xmx已经足够大,那么请检查应用程序是不是存在bug,例如:应用程序可能在计算数组的大小时,存在算法错误,导致数组的size很大,从而导致巨大的数组被分配。

6、 oom for small swap=>例如:exception in thread "main": java.lang.outofmemoryerror: requestbytes for . out of swap space?

【分析】

抛出这类错误,是由于从native堆中分配内存失败,并且堆内存可能接近耗尽。这类错误可能跟应用程序没有关系,例如下面两种原因也会导致错误的发生:

(1)操作系统配置了较小的交换区

(2)系统的另外一个进程正在消耗所有的内存

【解决方法】

(1)、检查os的swap是不是没有设置或者设置的过小

(2)、检查是否有其他进程在消耗大量的内存,从而导致当前的jvm内存不够分配。

注意:虽然有时部分显示导致oom的原因,但大多数情况下,显示的是提示分配失败的源模块的名称,所以有必要查看日志文件,如crash时的hs文件。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值