一、内存模型图解析
二、JVM内存参数设置
springboot常规设置:
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek a‐server.jar
栈空间大小的影响:
演示栈溢出
public class StackOverFlowTest {
static int a = 1;
public static void test1(){
a++;
test1();
}
public static void main(String[] args) {
try{
test1();
}catch (Throwable e){
e.printStackTrace();
System.out.println(a);
}
}
}
- -Xss512k
java.lang.StackOverflowError
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:7)
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:8)
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:8)
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:8)
1079
- -Xss2048k
java.lang.StackOverflowError
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:7)
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:8)
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:8)
at com.chinobot.test.xiaoww.jvm.StackOverFlowTest.test1(StackOverFlowTest.java:8)
95594
栈设置为512k,变量a累计加到1079时栈就溢出了,当栈空间增大到2048k时,变量a累计加到95594才溢出,可知-Xss设置越小a就越小,线程栈里可分配的栈帧就越小(栈帧属于栈的元素),相反jvm可开启的线程数就越多
三、参数设置方法
内存参数设置不固定,根据系统的并发量,服务器内存大小动态设置
业务并发量大,每秒生成的数据就越多,这些数据存放在新生代,同时这些对象数据可能用过之后就属于垃圾对象了,新生代设置过小会导致频繁触发minor GC/young GC,某些情况会导致minor GC清除不掉这些垃圾对象而被移入老年代,老年代最终触发full GC。
预估每个对象大小,每秒的并发量,估算出每秒生成的数据大小