对于OOM的了解,以及如何处理OOM?
1、什么是OOM?
OOM,全称是Out Of Memory ,意思就是超出内存空间,造成内存溢出,或者内存泄漏。当jvm没有足够的空间为对象分配空间的时候,或者是垃圾回收器现在也没有多余的空间进行回收,这时候造成的空间溢出,就会抛出OOM异常。
所谓的内存溢出:说白了就是内存不足;所谓的内存泄漏:说白了就是在内存中可能会出现这样的对象:对象的引用是弱引用,在垃圾回收的时候置为null,但是值还是强引用,这个时候,这部分的内存不能分配给其他的对象,造成虚拟机不能再一次的使用该内存。
2、常见的OOM?
2.1、堆空间溢出
2.2、永久代空间溢出
2.3、在JVM规范中提到,在Java运行时数据区中,除了程序计数器以外的其他的四个部分,都是可能会造成OOM异常。
3、如何解决OOM问题?
3.1、可以dump堆内存的镜像信息
设置jvm参数:-XX:+HeapDumpOnOutOfMemoryError,程序运行时,当发生OOM异常时,就会自动的dump堆内存的相关信息,以便进行分析。不过这个方法需要在JDK1.5版本以上。
3.2、可以使用JDK自带的 jmap 命令 "jmap -dump:format=b,file=heap.bin <pid>" 其中的 pid 可以使用 jps 获得。
3.3、得到了dump文件后,如何分析,可以使用以下工具分析:
A、mat 工具,这个工具是基于eclipse rcp 内存分析工具。
B、jhat 工具,这个工具是JDK自带的内存分析工具。
4、java如何防止OOM问题呢?
能出现OOM问题的原因就是:
A、给jvm分配的内存空间太小了,导致可能会频繁的出现内存不足现象。
B、对象用的太多,并且用完了之后,没有进行空间的释放,导致空间资源浪费,出现OOM问题。
解决:
可以设置jvm的相关堆参数,将堆的空间设置的大一些,但是一般不推荐,因为分配给jvm的资源时一定的,对的空间多了,其他的资源就少了,尽管可能会解决OOM问题,但是可能会出现其他的问题,所以一般情况,就使用默认的。
可以使用GC进行分代回收,或者使用内存的分配策略,进行解决。