你平时工作用过的jvm常用基本配置参数有哪些?
long totalMemory = Runtime.getRuntime().totalMemory();//返回jvm启动时内存总容量
long maxMemory = Runtime.getRuntime().maxMemory();// 返回jvm视图使用最大的内容容量
System.out.println("-Xms:"+totalMemory/1024/1024);
System.out.println("-Xmx:"+maxMemory/1024/1024);
常用参数:
-Xms:初始大小内存,默认为物理内存的 1/64,等价于-XX:InitialHeapSize
-Xmx:最大分配内存,默认物理内存1/4,等价于-XX:MaxHeapSize
-Xss:设置单个线程栈大小,一般默认为 512k~1024k,等价于
-XX:ThreadStackSize
注意:如果获取的-Xss结果为0,代表采用平台默认值,不同平台默认值不同,通常为1024k
-Xmn:设置年轻代大小
-XX:MetaspaceSize :设置元空间大小
注意:元空间的本质和永久代类似,都是对JVM规范中方法区的内存实现,但是元空间和永久代(堆空间)之间最大的差别在于:元空间内存并不在JVM内存中,而是直接使用本地内存,所以默认情况,元空间的大小只受本地内存限制。
设置案例:
(1) 将堆的最小值-Xms 参数与最大值-Xmx 参数设置为一样即可避免堆自动扩展(内存抖动)。因为JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。
(2) 栈大小通常只有几百k,决定于函数调用的深度。每个线程都有自己独立的栈空间(私有栈空间,不共享)。如果函数调用太深,超过了栈的大小,则会抛出java.lang.StackOverflowError。遇到这种错误,通常情况下,不是去调整-Xss参数,而是应该去检查是否是函数调用太深导致的,是否使用了递归,能不能保证递归出口等。
(3) -XX:+UseParallelGC 默认采用并行垃圾回收器 -XX:+UseSerialGC 采用串行垃圾回收器
-Xms4270m -Xms4270m -XX:MetaspaceSize=1024m
-XX:+PrintCommandLineFlags
-XX:+PrintGCDetails -XX:+UseParallelGC