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:+CMSClassUnloadingEnabled


3、OOM for GC=>例如:java.lang.OutOfMemoryError: GC overhead limit exceeded

分 析

此OOM是由于JVM在GC时,对象过多,导致内存溢出,建议调整GC的策略,在一定比例下开始GC而不要使用默认的策略,或者将新代和老代设置合适的大小,需要进行微调存活率。

解决方法

改变GC策略,在老代80%时就是开始GC,并且将-XX:SurvivorRatio(-XX:SurvivorRatio=8)(Eden与Survivor的占用比例。例如8表示,一个survivor区占用 1/8 的Eden内存,即1/10的新生代内存,为什么不是1/9?
因为我们的新生代有2个survivor,即S0和S1。所以survivor总共是占用新生代内存的 2/10,Eden与新生代的占比则为 8/10)和-XX:NewRatio(-XX:NewRatio=4)(新生代和年老代的堆内存占用比例, 例如2表示新生代占年老代的1/2,占整个堆内存的1/3)设置的更合理。


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文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在开发一个在线拍卖网站的过程,可能会出现以下一些场景导致OOM现象: 1. 高并发请求:如果网站在短时间内接收到大量的并发请求,每个请求都需要占用一定的内存资源。如果并发请求数量过大,超过服务器的处理能力,可能会导致内存耗尽。解决方法可以是增加服务器的内存容量或者优化代码,提高请求处理的效率。 2. 内存泄漏:在网站代码存在内存泄漏的情况下,不再需要的对象无法被垃圾回收机制回收,逐渐占用了大量的内存空间。解决方法是进行代码审查,确保没有存在内存泄漏的问题,及时释放不再使用的对象。 3. 图片或文件处理:在线拍卖网站通常需要处理大量的图片或文件上传、下载等操作。如果没有适当地管理这些资源,例如没有及时释放打开的文件流或者没有合理地缓存图片,可能会导致内存耗尽。解决方法是使用合适的缓存策略,限制文件上传大小,及时关闭文件流等。 4. 数据库连接管理:如果使用数据库连接池来管理数据库连接,在高并发情况下,如果没有正确释放或管理数据库连接,可能会导致连接池的连接被耗尽,从而导致OOM解决方法是使用连接池来管理连接,并确保在使用完毕后及时释放连接。 5. 不合理的缓存使用:缓存可以提高网站的性能,但如果缓存的数据量过大或者缓存策略不合理,可能会导致内存占用过大。解决方法是合理设置缓存的大小和过期时间,定期清理缓存过期的数据。 总之,在开发过程,合理管理内存资源、进行性能测试和监控是避免OOM问题的关键。同时,优化代码、增加服务器资源、合理配置缓存等方法也可以帮助解决OOM问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值