91名师指路-头部
91名师指路

JVM系列(十):堆内存调优

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

一:jdk1.7堆结构


二:jdk1.8堆结构



三:堆内存调优

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

代码演示打印-Xms,-Xmx的大小。

package com.mszl.jvm;

/**
* 功能:堆内存
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
public class T2 {

public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors() + "核"); // cpu核数

long totalMemory=Runtime.getRuntime().totalMemory();
long maxMemory=Runtime.getRuntime().maxMemory();

System.out.println("-Xms: " + totalMemory/1024/1024 + "MB");
System.out.println("-Xmx: " + maxMemory/1024/1024 + "MB");
}

}

执行结果

4核
-Xms: 15MB
-Xmx: 247MB


四:演示堆内存溢出

首先将eclipse的jvm参数设置为 -Xms10m -Xmx10m -XX:+PrintGCDetails 方便演示。

package com.mszl.jvm;

/**
* 功能:java.lang.OutOfMemoryError: Java heap space
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
public class T3 {

public static void main(String[] args) {
long maxMemory=Runtime.getRuntime().maxMemory();
System.out.println("-Xmx: " + maxMemory/1024/1024 + "MB");
byte[] bt=new byte[20 * 1024 * 1024];
}

}

执行结果

最大堆内存为9M,我们发现新生代的内存为3072k,老年代的内存为6848k,3072/1024+6848/1024=9.68M约等于最大堆内存9M。同时也验证了堆内存由新生代+养老代组成。

注意:要将-Xms和-Xmx的内存设置为一样,是为了避免JVM调整堆大小。


2020-03-29 21:49:41     阅读(1133)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部