0
点赞
收藏
分享

微信扫一扫

java堆溢出实战

niboac 2022-04-24 阅读 50
java

文章目录


前言

上一篇文章概述了Java运行时的数据区域划分,其中Java堆是用来存储对象实例的,所以只要不停的创建对像,然后保证GCRoot到对象间有可达路径,这样就可以避免垃圾回收机制回收掉你创建的对象,就可以造成堆空间不停缩小,到达容量限制,产生OOM


一、参数设置

主要参数: -Xms20M -Xmx20M 最大最小堆容量都是一样的就是不可拓展堆

-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError

二、代码实现

import java.util.ArrayList;
import java.util.List;

/**
 * @author jc
 */
public class ObjectVMTest {
    static  class OOMobject{}

    public static void main(String[] args) {
        List<OOMobject> list = new ArrayList<>();

        while (true) {
            list.add(new OOMobject());
        }
    }
}

结果

在这里插入图片描述

处理方法

处理方法一般通过内存映像分析工具

首先确认是内存泄漏还是内存溢出

  1. 内存泄漏:

通过工具查看泄漏对象到GCRoot的引用链,找到这个对象是怎么样的引用路径导致垃圾回收器不能回收的。最重要的是定位对象位置,找到问题的具体代码

  1. 内存溢出:

就是对象都是必须存活的,就要调参数,就是前面我们用来设置堆最大和最小的参数,对比实际的机器内存看能不能再调高一点,然后还可以调整优化算法,看看存储结构合不合理,还有对象生命周期,能不能减少对象的存活时间,就是围绕减少内存消耗来做事情

举报

相关推荐

0 条评论