对于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进行分代回收,或者使用内存的分配策略,进行解决。
        

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务