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

2.1 堆分配参数

-XX:+PrintGC    使用这个参数,虚拟机启动后,只要遇到GC就会打印日志。
-XX:+UseSerialGC    配置串行回收器
-XX:+PrintGCDetails    可以查看详细信息,包括各个区的情况
-Xms    设置java程序启动时初始堆大小
-Xmx    设置java程序能获得的最大堆大小
-XX:+PrintCommandLineFlags    可以将隐式或者显式传给虚拟机的参数输出

//查看GC信息
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());

byte[] b1 = new byte[1*1024*1024];
System.out.println("分配了1M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());

byte[] b2 = new byte[4*1024*1024];
System.out.println("分配了4M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());

运行参数: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

在实际工作中,可以直接讲初始化的堆大小与最大堆大小设置相等,这样的好处是可以减少运行时的垃圾回收次数,从而提高性能。

新生代的配置

-Xmn:可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数堆系统的性能以及GC行为有较大的影响,新生代大小一般会设置整个堆空间的的1/3到1/4左右。

-XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例。(-XX:SurvivorRatio=eden/from=eden/to)

-XX:NewRatio 用来设置老年代和新生代的比例。(-XX:NewRatio=老年代/新生代)

byte[] b = null;
//连续向系统申请10MB空间
for(int i = 0 ; i <10; i ++){
    b = new byte[1*1024*1024];
}

根据不同的参数运行:

-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=6 -XX:+PrintGCDetails -XX:+UseSerialGC

-Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

-Xms20m -Xmx20m -XX:NewRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

2.2 对溢出处理

在java程序运行过程中,如果堆空间不足,则会抛出内存溢出错误(Out of Menory),一旦这类问题发生在生产环境,可能引起严重的业务中断,java虚拟机提供了 -XX:+HeapDumpOnOutOfMemoryError,使用该参数可以在内存溢出时导出整个堆信息,与之配合使用的参数有 -XX:HeapDumpPath ,可以设置导出堆的存放路径。

Vector v = new Vector();
for(int i=0; i < 5; i ++){
    v.add(new Byte[1*1024*1024]);
}

-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump

D盘生成 Test03.dump 文件,可能用 Memory Analyzer 工具分析。

2.3 栈配置

java虚拟机提供了参数-Xss来指定线程最大的栈空间大小,整个参数也直接指定了函数可调用的最大深度。

//栈调用深度
rivate static int count;

public static void recursion(){
    count++;
    recursion();
}
public static void main(String[] args){
    try {
        recursion();
    } catch (Throwable t) {
        System.out.println("调用最大深入:" + count);
        t.printStackTrace();
    }
}

-Xss1m

-Xss5m

————————————————
版权声明:本文为CSDN博主「写代码的小森森」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/willson_l/java/article/details/82771042