分析Java 堆

来源:互联网 发布:华西电子盘软件下载 编辑:程序博客网 时间:2024/05/19 18:13
分析Java 堆

一.常见的内存溢出:堆溢出,直接内存溢出,永久区溢出等

二.堆溢出
    1.原因一:分配在堆上的对象都持有强引用,导致无法回收,绝大多数内存溢出都是这种情况
    2.解决方案:
        1.使用-Xmx 调整堆得空间大小
        2.合理优化程序(置空对象)

    3.原因二:GC 的低效率引起的 OOM
    4.解决方案:
        1.增大堆空间
        2.使用 -XX:-UseGCOverHeadLimit 禁止该种 OOM 提示的产生

三.直接内存溢出
    1.原因一:使用 NIO 不当,导致直接内存溢出
    2.解决方案:
        1.设置合理的 -XX:MaxDirecMemorySize 大小(当直接内存达到设置的大小,触发一次 GC)
        2.减小堆的大小,但是这样做会增加堆溢出的风险
        
    3.原因二:开启的线程太多(每一个线程的开启都需要占用系统内存,线程的空间在堆外分配)
    4.解决方案:
        1.减少每一个线程所占内存空间的大小,使用 -Xss 设置,但是会增加栈溢出的风险
        2.减少堆的大小,预留更多的空间用于创建线程

四.永久区溢出
    1.原因:系统定义了太多的类型,类的元数据信息(JDK1.8 中没有永久区,元数据区替代了永久区)
    2.解决方案:
        1.增加 MaxPermSize 的值
        2.减少系统需要的类
        3.使用 ClassLoader 合理加载各个类,并定期进行回收

五.内存泄露
    不在使用的对象占据内存不被释放,可使用内存不断减小,导致内存溢出

六.建议
    不在使用的对象,将对象置为 null ,减少内存溢出的风险