Java堆溢出实战

提示:参考深入理解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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值