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

开发 后端
本文详细的介绍了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 指的是一个进程的***内存

JVMMemory JVM内存

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: request <size> bytes for <reason>. Out of swap space?

分  析

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

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

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

解决方法

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

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

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

原文链接:http://www.cnblogs.com/cx361/archive/2011/12/02/2271889.html

【编辑推荐】

  1. Java NIO之选择就绪模式
  2. Java代码规范那些事
  3. Java效率真的很低吗?Android为何要采用?
  4. 漫谈Java开源5年:自由但带着枷锁
  5. JavaFX2.0网格布局窗格GridPane

 

责任编辑:林师授 来源: 十分爱的博客
相关推荐

2021-01-12 11:40:12

SonarQube平台数据项目授权

2016-09-23 20:46:53

2022-10-13 07:35:52

数据配置MySQL

2011-08-29 16:23:29

Lua脚本

2009-07-01 18:14:36

JSP乱码

2009-07-10 14:32:06

JVM崩溃

2011-05-06 17:25:58

硒鼓

2013-01-30 16:54:21

2010-06-09 09:39:42

Opensuse双系统

2009-12-16 10:50:26

2010-06-21 09:54:50

Linux Aplay

2011-04-29 13:22:48

ThinkPad笔记本故障

2010-08-12 09:30:08

Flex内存泄露

2022-04-02 20:27:30

ETS操作系统鸿蒙

2009-07-24 10:42:28

CLR线程池

2022-04-06 10:09:17

云服务云计算

2010-12-27 10:48:10

VirtualboxFreedos

2011-06-16 10:27:55

.NET内存泄漏

2019-10-11 19:45:28

SparkSQLHiveHadoop

2013-06-25 09:16:10

Unity3D
点赞
收藏

51CTO技术栈公众号