java中OutOfMemoryError异常总结

13 篇文章 0 订阅

最近在生产中,接连出现了OutOfMemoryError的异常,现将相关总结如下:

1 java.lang.OutOfMemoryError: unable to create new native thread

这个异常是由于操作系统没有足够的资源来创建新的线程造成的。系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来

创建线程。因此,当线程数量大到一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。

分配给Java虚拟机的内存愈多,系统剩余的资源就越少,因此,当系统内存固定时,分配给Java虚拟机的内存越多,那么,

系统总共能够产生的线程也就越少,两者成反比的关系。

解决方案:1、 线程数量不能减少的情况下,通过-Xss减小单个线程大小(stacksize),以便能生产更多的线程。

 2、增加系统总共可以生产的线程数(max userprocesses)


2 java.lang.OutOfMemoryError: PermGen space

在jdk8及以下,会出现该异常,jdk8后就不存在永久代这个概念了,而是元空间,所以也就不会出现这个异常了。该异常是因为分配的永久代(Perm)空间被占满,无法为新的class分配存储空间而引发的异常。这个异常以前是没有的,但是在Java反射大量使用的今天这个异常比较常见了,jsp页面较多也会出现这个异常,因为一个jsp就对应了一个java类。当大量动态生成的类不断被加载时,最终导致Perm区被占满(因为永久代是存放类的相关信息的)

解决方案:1、-XX:MaxPermSize=512m 增加永久代的大小


java.lang.OutOfMemoryError: Java heap space

当所有的堆空间都被无法回收的垃圾对象占满时,虚拟机再也无法分配新的堆空间就会抛这个异常。该异常很可能是程序中存在代码的内存泄露而导致的。

解决方案:1、通过JVM监控工具,对比溢出前后的对象引用,从而找到系统中的泄露点。

 2、如果不是程序内部的泄露造成的,则增加堆的大小-Xmx 2048M

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值