什么是虚拟机参数配置
在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障
排查会有一定的帮助,为此,在虚拟机提供了一些跟踪系统状态的参数,使用
给定的参数执行Java虚拟机,就可以在系统运行时打印相关日志,用于分析实际
问题。我们进行虚拟机参数配置,其实就是围绕着堆、栈、方法区、进行配置。
堆的参数配置
-XX:+PrintGC 每次触发GC的时候打印相关日志
-XX:+UseSerialGC 串行回收
-XX:+PrintGCDetails 更详细的GC日志
-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
含以-XX:SurvivorRatio=eden/from=den/to
总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,
这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。
-XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
设置最大堆内存
参数: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
publicclass JvmDemo01 {
publicstaticvoid main(String[] args) throws InterruptedException {
byte[] b1 = newbyte[1 * 1024 * 1024];
System.out.println("分配了1m");
jvmInfo();
Thread.sleep(3000);
byte[] b2 = newbyte[4 * 1024 * 1024];
System.out.println("分配了4m");
Thread.sleep(3000);
jvmInfo();
}
/**
* 转换为m
*
* @param maxMemory
* @return
*/
staticprivate String toM(longmaxMemory) {
floatnum = (float) maxMemory / (1024 * 1024);
DecimalFormat df = new DecimalFormat("0.00");// 格式化小数
String s = df.format(num);// 返回的是String类型
returns;
}
staticprivatevoid jvmInfo() {
// 最大内存
longmaxMemory = Runtime.getRuntime().maxMemory();
System.out.println("maxMemory:" + maxMemory + ",转换为M:" + toM(maxMemory));
// 当前空闲内存
longfreeMemory = Runtime.getRuntime().freeMemory();
System.out.println("freeMemory:" +freeMemory+",转换为M:"+toM(freeMemory));
// 已经使用内存
longtotalMemory = Runtime.getRuntime().totalMemory();
System.out.println("totalMemory:" +totalMemory+",转换为M"+toM(totalMemory));
}
}
设置新生代与老年代优化参数
-Xmn 新生代大小,一般设为整个堆的1/3到1/4左右
-XX:SurvivorRatio 设置新生代中eden区和from/to空间的比例关系n/1
设置新生代比例参数
参数: -Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
publicclass JvmDemo02 {
publicstaticvoid main(String[] args) {
//-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
byte [] b = null;
for (inti = 0; i < 10; i++) {
b =newbyte[1*1024*1024];
}
}
}
设置新生与老年代代参数
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:NewRatio=2(比例为1/2)
总结:不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,
应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,
减少老年代的GC次数。
除了可以设置新生代的绝对大小(-Xmn),可以使用(-XX:NewRatio)设置新生代和老年
代的比例:-XX:NewRatio=老年代/新生代