JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看
一 jvm的内存模型
2.1 jvm内存模型概览
二 实操案例
2.1 设置和查看栈大小
1.代码
/*** 演示栈中的异常:StackOverflowError** @author shkstart* @create 2020 下午 9:08** 设置栈的大小: -Xss (-XX:ThreadStackSize)** -XX:+PrintFlagsFinal*/
public class StackErrorTest {private static int count = 1;public static void main(String[] args) {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}try {count++;main(args);}catch (Throwable e){System.out.println("递归的次数为:" + count);}}}
2.设置
3.查看: jinfo -flag ThreadStackSize pid
2.2 查堆的大小
1.代码
package com.ljf.jvm.optimise.staick;/*** 1. 设置堆空间大小的参数* -Xms 用来设置堆空间(年轻代+老年代)的初始内存大小* -X 是jvm的运行参数* ms 是memory start* -Xmx 用来设置堆空间(年轻代+老年代)的最大内存大小** 2. 默认堆空间的大小* 初始内存大小:物理电脑内存大小 / 64* 最大内存大小:物理电脑内存大小 / 4* 3. 手动设置:-Xms600m -Xmx600m* 开发中建议将初始堆内存和最大的堆内存设置成相同的值。** 4. -XX:+PrintFlagsFinal** @create 2021 20:15*/
public class HeapSpaceInitial {public static void main(String[] args) {//返回Java虚拟机中的堆内存总量long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;//返回Java虚拟机试图使用的最大堆内存量long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;System.out.println("-Xms : " + initialMemory + "M");System.out.println("-Xmx : " + maxMemory + "M");// System.out.println("系统内存大小为:" + initialMemory * 64.0 / 1024 + "G");
// System.out.println("系统内存大小为:" + maxMemory * 4.0 / 1024 + "G");try {Thread.sleep(1000000);} catch (InterruptedException e) {e.printStackTrace();}}
}
2.查看
2.2 设置堆大小和日志输出
1.代码
/** 测试:大对象直接进入老年代* -Xms60m -Xmx60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails* @create 2021 21:48*/
public class YoungOldAreaTest {public static void main(String[] args) {byte[] buffer = new byte[1024 * 1024 * 20];//20m}
}
2.进行设置: -Xms60m -Xmx60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails
3.输出日志