Java开发过程中会出现哪些OOM?

什么是OOM?OOM时Java开发中不可避免的一个常见问题,尤其在面试时,面试官会经常问到“谈谈你对OOM的认识”。本文整理一些Java开发过程中常见的OOM,希望看完本文对大家有所帮助。

java.lang.OutOfMemoryError:Java heap space

溢出原因:深入理解Java虚拟机书中讲到java堆溢出,Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。

java.lang.OutOfMemoryError:GC overhead limit exceeded

GC回收时间长时会抛出OutOfMemoryError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存,连续多次GC都只回收了不到2%的极端情况下才会抛出。假设不抛出GC overhead limit错误会发生什么情况呢?那就是GC清理的这么点内存很快会再次填满,迫使GC再次执行,这样就形成恶性循环,CPU使用率一直是100%,而GC确没有任何成果。

java.lang.OutOfMemoryError:Direct buffer memory

Direct memory可以通过参数-XX:MaxDirectMemorySize设定本机直接内存可用大小,如果不指定,则默认与java堆内存大小相同。过使用-XX:MaxDirectMemorySize=5M,限制最大可使用的本机直接内存大小为5MB,如果超过将抛出异常。

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

不知道你们生产环境是否会出现这种情况,高并发请求服务器时,经常出现如下异常java.lang.OutOfMemoryError:unable to create new native thread。那出现的原因呢?

1.创建太多的线程了

2.服务器的设置限制了你创建线程的数量了

java.langOutOfMemoryError:Metaspace

我们知道Java8及以后已经使用Metaspace来替代永久代,Metaspace并不在虚拟机内存中而是使用本地内存。主要还是是加载到内存中的class数量太多或者体积太大。这时可以通过JVM参数-XX:MaxMetaspaceSize指定。

(0)

相关推荐