堆内存调优

堆内存分析:

1、没有修改VM 参数

运行以下示例:

public class Demo2 {
    public static void main(String[] args) {
        //返回虚拟机试图使用的最大内存
        long max = Runtime.getRuntime().maxMemory();//字节 1024*104
        //返回jvm的总内存
        long total = Runtime.getRuntime().totalMemory();

        System.out.println("max="+"字节\t"+(max/(double)1024/1024)+"MB");
        System.out.println("total="+"字节\t"+(total/(double)1024/1024)+"MB");

        //默认情况下: 分配的总内存 是电脑内存的1/4,而初始化的内存: 1/64
    }
  
    
}

结果:
打印默认初始化内存和最大分配内存

因为我的电脑内存为16g,所以可以看出默认情况下:分配的总内存 是电脑内存的1/4,而初始化的内存: 1/64

2、堆内存大小是可以修改的。

修改VM options如下图所示
修改VM参数

再运行代码:

public class Demo2 {
    public static void main(String[] args) {
        //返回虚拟机试图使用的最大内存
        long max = Runtime.getRuntime().maxMemory();//字节 1024*104
        //返回jvm的总内存
        long total = Runtime.getRuntime().totalMemory();

        System.out.println("max="+"字节\t"+(max/(double)1024/1024)+"MB");
        System.out.println("total="+"字节\t"+(total/(double)1024/1024)+"MB");

        //默认情况下: 分配的总内存 是电脑内存的1/4,而初始化的内存: 1/64
    }
    //OOM:
        //1、尝试扩大内存看结果
        //2、分析内存,看一下那个地方出现了问题(专业工具)

    //-Xms1024m -Xmx1024m -XX:+PrintGCDetails

}

结果:
打印GC情况

从上面图中可以看出,JDK1.8的堆中有年轻代(PSYoungGen)、老年代(ParOldGen)、元空间(Metaspace)

OOM错误示例:

先修改堆内存为小内存

//-Xms8m -Xmx8m -XX:+PrintGCDetails

后运行以下代码:

public class Hello {
    public static void main(String[] args) {
        String str = "kuangshensayjava";
        while(true){
            str += str + new Random().nextInt(888888888) + new Random().nextInt(999999999);

        }
    }
}

结果:
OOM错误

VM option参数解释:

-Xms 设置初始化内存分配大小 默认为 1/64

-Xmx 设置最大分配内存,默认为 1/4

-XX:+PrintGCDetails 打印GC情况

-XX:+HeapDumpOnOutOfMemoryError Dump出OOM错误

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值