JVM之堆内存调优

堆结构

java7

在这里插入图片描述

java8

在这里插入图片描述

在Java8中,永久代己经被移除,被一个称为元空间的区域所取代。元空间的本质和永久代类似。

元空间与永久代之间最大的区别在于:永久带使用的JVM的堆内存,但是java8以后的元空间并不在虚拟机中而是使用本机物理内存。

因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入native memory,字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制,而由系统的实际可用空间来控制。

默认出厂JVM元空间只会用物理内存的1/4

堆内存调优

java查看核数以及内存使用量

/**
 * 我的机器是8核心,16G内存
 */
public class JvmDemo {

    public static void main(String[] args) {
        // 查看机器的核数
        System.out.println(Runtime.getRuntime().availableProcessors());
        // 返回java虚拟机试图使用最大的内存量
        long maxMemory = Runtime.getRuntime().maxMemory();
        // 返回java虚拟机中的内存总量
        long totalMemory = Runtime.getRuntime().totalMemory();
        System.out.println("-Xmx:maxMemory = " + maxMemory + " byte\t" + maxMemory / (double) 1024 / 1024 + " MB");
        System.out.println("-Xms:totalMemory = " + totalMemory + " byte\t" + totalMemory / (double) 1024 / 1024 + " MB");
    }
}

调优

-Xms:设置初始堆内存分配大小,默认为物理内存的 1 / 64
-Xmx:设置最大内存分配大小,默认为物理内存的 1 / 4
-XX:+PrintGCDetails:输出相信的GC处理日志

实际生产环境中, 我们通常将初始化堆(-Xms) 和 最大堆(-Xmx) 设置为一样大。以避免GC和应用程序争抢内存,应用程序频繁的申请堆空间使其产生停顿,内存忽高忽低,最终出现莫名奇妙的异常

在IDEA中配置堆内存调优参数:

-Xms1024m -Xmx1024m -XX:+PrintGCDetails

在这里插入图片描述

运行如下程序

/**
 * 我的机器是8核心,16G内存
 */
public class JvmDemo {

    public static void main(String[] args) {
        // 查看机器的核数
        System.out.println(Runtime.getRuntime().availableProcessors());
        // 返回java虚拟机试图使用最大的内存量
        long maxMemory = Runtime.getRuntime().maxMemory();
        // 返回java虚拟机中的内存总量
        long totalMemory = Runtime.getRuntime().totalMemory();
        System.out.println("-Xmx:maxMemory = " + maxMemory + " byte\t" + maxMemory / (double) 1024 / 1024 + " MB");
        System.out.println("-Xms:totalMemory = " + totalMemory + " byte\t" + totalMemory / (double) 1024 / 1024 + " MB");
    }
}

运行结果

在这里插入图片描述

产生OOM,堆内存溢出错误

在IDEA中配置堆内存调优参数:

-Xms10m -Xmx10m -XX:+PrintGCDetails

运行如下程序

public class JvmDemo {

    public static void main(String[] args) {
        String str = "itvip666.com";
        while (true) {
            str += str + new Random().nextInt(65536) + new Random().nextInt(65536);
        }
    }
}

运行结果

在这里插入图片描述

在这里插入图片描述


Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgy_yuebin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值