JVM调优、JProfiler、Dump内存快照

本文介绍了如何调整JVM的堆内存大小以避免OOM异常,详细讲解了使用JProfiler工具分析内存快照的方法,以及在遇到OOM时的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.yuan;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/5/27 20:24
 */
public class demo2 {
    public static void main(String[] args) {
        //返回Java虚拟机试图使用的最大内存量
        long maxMemory = Runtime.getRuntime().maxMemory();
        //返回JVM初始总内存
        long totalMemory = Runtime.getRuntime().totalMemory();

        System.out.println("试图最大内存量:"+maxMemory+"字节, "+maxMemory/(double)1024/1024+"MB");
        System.out.println("JVM初始总内存:"+totalMemory+"字节, "+totalMemory/(double)1024/1024+"MB");
    }
}

初始的堆内存:
发现,默认的情况下分配的内存是总内存的 1/4,而初始化的内存为 1/64 !在这里插入图片描述

1.调堆的内存

刚刚是默认的内存,现在我们来调一下堆的内存:

IDEA中进行JVM调优参数设置,然后启动
在这里插入图片描述
VM参数调优:把初始内存,和总内存都调为 1024M(可以自己设,这就是调堆的大小,属于JVM调优了),在上面输入:
在这里插入图片描述1、-Xms 等价于 -XX:InitialHeapSize 初始堆大小
2、-Xmx 等价于 -XX:MaxHeapSize 最大堆大小

-Xms1024m -Xmx1024m -XX:+PrintGCDetails

VM参数调优:把初始内存,和总内存都调为 1024M,运行,查看结果!(还是使用上面的代码)在这里插入图片描述
在这里插入图片描述

2.模拟OMM出现

package com.yuan;

import java.util.Random;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/5/27 20:43
 */
public class demo3 {
    public static void main(String[] args) {
        String str="hellowordhelloworld";
        while (true){
            str+=str+new Random().nextInt(88888888)
                    +new Random().nextInt(999999999);
        }
    }
}

我们先像刚刚那样设置VM的大小,VM就是虚拟机的大小(一般也为堆的大小?),只不过不想刚刚设为1024M了,现在我们都设为8M就好了,为了模拟出OOM:

-Xms8m -Xmx8m -XX:+PrintGCDetails

在这里插入图片描述
运行:
在这里插入图片描述在这里插入图片描述

爆OOM了。(若养老区执行了Full GC后发现依然无法进行对象的保存,就会产生OOM异常

解决OOM的方法(重点):

1.设置VM,把堆的大小调大,就是我们刚刚演示的那种,如果调大了还爆OOM,证明是代码的问题了。
2.使用JProfiler看哪里出错了(更好)

3.JProfiler使用

JProfiler就是来分析dump内存快照的在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

package com.yuan;

import java.util.ArrayList;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/5/27 21:35
 */
public class demo4 {
    byte[] byteArray=new byte[1*1024*1024];  //1M

    public static void main(String[] args) {
        ArrayList<demo4> list=new ArrayList<>();
        int count=0;
        try {
            while (true){
                list.add(new demo4());
                count+=1;
            }
        } catch (Error e) {
            System.out.println("count了几次:"+count);
            e.printStackTrace();
        }
    }
}

我们先设置vm参数再运行 :

-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

在这里插入图片描述

这是出现OutOfMemoryError错误就会生成dump文件的意思,你也可以设置为别的异常。

运行:
在这里插入图片描述生成了dump文件,我们一般通过JProfiler来分析它的,dump生成一般在我们类的前几个目录:

在这里插入图片描述
双击它:
在这里插入图片描述
在这里插入图片描述
一般分析完就把dump删了,因为它大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值