欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM参数调优(虚拟机参数配置)

程序员文章站 2022-07-12 18:14:47
...

虚拟机参数配置


什么是虚拟机参数配置

在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障
排查会有一定的帮助,为此,在虚拟机提供了一些跟踪系统状态的参数,使用
给定的参数执行Java虚拟机,就可以在系统运行时打印相关日志,用于分析实际
问题。我们进行虚拟机参数配置,其实就是围绕着堆、栈、方法区、进行配置。

堆的参数配置

参数 意义
常见配置汇总
堆设置
-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-XX:NewSize=n 设置年轻代大小
-XX:NewRatio=n 设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个
-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值.
注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n 设置持久代大小
收集器设置
-XX:+UseSerialGC 设置串行收集器
-XX:+UseParallelGC 设置并行收集器
-XX:+UseParalledlOldGC 设置并行年老代收集器
-XX:+UseConcMarkSweepGC 设置并发收集器
垃圾回收统计信息
-XX:+PrintGC 每次触发GC的时候打印相关日志
-XX:+PrintGCDetails 更详细的GC日志
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n 设置并行收集器收集时使用的CPU数.并行收集//线程数.
-XX:MaxGCPauseMillis=n 设置并行收集最大暂停时间
-XX:GCTimeRatio=n 设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode 设置为增量模式.适用于单CPU情况.
-XX:ParallelGCThreads=n 设置并发收集器年轻代收集方式为并行收集时,使用的CPU数.并行收集线程数.

总结:

在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等
这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。

设置最大堆内存

参数:

 -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

代码案例

public class JvmMaxHeapMemory {
    /**
     * 设置最大堆内存
     * 参数: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
     */
    public static void main(String[] args) throws InterruptedException {
        byte[] b1 = new byte[1 * 1024 * 1024];
        System.out.println("分配了1M内存");
        jvmInfo();
        Thread.sleep(3000);
        byte[] b2 = new byte[4 * 1024 * 1024];
        System.out.println("分配了4M内存");
        jvmInfo();
    }

    /**
     * 将kb转换成M
     * @param kb
     * @return
     */
    static String toM(long kb){
        float num = (float) kb / (1024 * 1024);
        //格式化小数
        DecimalFormat df = new DecimalFormat("0.00");
        //返回的是String类型
        String str = df.format(num);
        return str;

    }
    //获取当前jvm的参数信息
    static void jvmInfo(){
        //最大内存
        long maxMemory = Runtime.getRuntime().maxMemory();
        System.out.println("最大内存:"+maxMemory+"KB,转换为M:"+toM(maxMemory));
        //当前可用内存
        long freeMemory = Runtime.getRuntime().freeMemory();
        System.out.println("当前可用内存:"+freeMemory+"KB,转换为M:"+toM(freeMemory));
        //当前已用内存
        long totalMemory = Runtime.getRuntime().totalMemory();
        System.out.println("当前已用内存:"+totalMemory+"KB,转换为M:"+toM(totalMemory));
    }
}

jvm运行参数设置
JVM参数调优(虚拟机参数配置)

运行结果

JVM参数调优(虚拟机参数配置)

设置新生代与老年代优化参数

-Xmn 新生代大小,一般设为整个堆的1/3到1/4左右
-XX:SurvivorRatio 设置新生代中eden区和from/to空间的比例关系n/1

设置新生代比例参数

参数:
 -Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
代码案例
public class JvmNewSurvivor {
    /**
     * 设置新生代比例参数
     *  -Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
     */
    public static void main(String[] args) {
        byte[] b=null;
        for (int i=0;i<10;i++) {
            System.out.println("这是第"+i+"次!");
            b=new byte[1*1024*1024];
        }
    }
}
运行结果

JVM参数调优(虚拟机参数配置)

总结

注意看:eden区是from/to的2倍。
对应参数:-Xmn1m -XX:SurvivorRatio=2

设置新生与老年代代参数

参数:
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:NewRatio=2
运行结果

案例还是上面那个案例,改变jvm参数之后的结果如下:
JVM参数调优(虚拟机参数配置)

总结:

不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,应该根据系统的特点做出合理的配置。
基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。
除了可以设置新生代的绝对大小(-Xmn),
可以使用(-XX:NewRatio)设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代