
JVM-08垃圾收集Garbage Collection【GC常用参数】

= 1.8

‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M 
默认1M , 不足的话 StackOverflowError
-Xss设置越小 ,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多 ,当然了,线程多了并不一定性能就高,只是理论上是这样的。
-XX:MetaspaceSize=N -XX:MaxMetaspaceSize=N 【参数解读】
对于64位JVM来说,元空间的默认初始大小是21MB,若不足,GC后自动扩容,无上限,取决于操作系统的内存大小。
【经验之谈】
一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值 ,8G物理内存的机器来说,可以将这两个参数设置为256M
如果应用启动比较慢,可以看下是不是因为方法区的JVM参数没有设置(默认值21 ,频繁GC,自动扩容)导致的。
/**
* ‐Xss验证
*/
public class StackOverFlowErrorTest {
private static int count = 0 ;
public static void main(String[] args) {
try {
doCall();
}catch (Throwable e){
e.printStackTrace();
System.out.println("递归调用次数:" + count);
}
}
private static void doCall() {
count++;
// 递归调用,压入线程栈
doCall();
}
}默认配置 -Xss1m
java.lang.StackOverflowError
at com.artisan.gof.test.StackOverFlowErrorTest.doCall(StackOverFlowErrorTest.java:23)
........
........
........
at com.artisan.gof.test.StackOverFlowErrorTest.doCall(StackOverFlowErrorTest.java:23)
递归调用次数:20898

原因分析

递归调用导致栈溢出~