深入理解JVM系列教程(05) - JVM参数配置

JVM提供了诸多的参数进行JVM各个方面内存大小的设置,为Java应用进行优化提供了诸多的工具,本文将会详细分析各个参数的功能与使用。

1. 常见参数配置

-XX:+PrintGC          每次触发GC的时候打印相关日志

-XX:+UseSerialGC      串行回收

-XX:+PrintGCDetails   更详细的GC日志

-Xms                  堆初始值

-Xmx                  堆最大可用值

-Xmn                  新生代堆最大可用值

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

-XX:NewRatio          配置新生代与老年代占比 1:2

含以-XX:SurvivorRatio=eden/from=den/to

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

2. 堆内存大小配置

下面使用IDEA来演示,配置堆最大可以使用值20:(-Xmx20m),堆初始值:( -Xms5m)。

1.工具栏选择 Edit Configurations...:
深入理解JVM系列教程(05) - JVM参数配置
2.在VM options项,添加值:
深入理解JVM系列教程(05) - JVM参数配置

说明当下Java应用最大可用内存为20M, 初始内存为5M

public class Demo2 {

    public static void main(String[] args) {

        System.out.println("最大内存 ->"+Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");
        System.out.println("可用内存 ->"+Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");
        System.out.println("已经使用内存 ->"+Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");

        System.out.print("\n 分配4M的空间给数组-------------\n");
        byte[] b = new byte[4 * 1024 * 1024];
        System.out.println("最大内存 ->"+Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");
        System.out.println("可用内存 ->"+Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");
        System.out.println("已经使用内存 ->"+Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");
    }
}

运行结果:
深入理解JVM系列教程(05) - JVM参数配置
如果我们设置堆最大内存为1M,初始内存也为1M时:
深入理解JVM系列教程(05) - JVM参数配置
运行程序,内存不足报错(OutOfMemoryError):
深入理解JVM系列教程(05) - JVM参数配置

3. 设置新生代比例参数

使用示例:

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

说明:堆内存初始化值20m,堆内存最大值20m,新生代最大值可用1m,eden空间和from/to空间的比例为2/1

4. 设置新生代与老年代比例参数

使用示例:

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

说明:堆内存初始化值20m,堆内存最大值20m,新生代最大值可用1m,eden空间和from/to空间的比例为2/1,新生代和老年代的占比为1/2 。

总结

深入理解JVM系列教程(05) - JVM参数配置

 

上一篇:编译MTK系统源码时checking Env失败的解决方法


下一篇:直接内存 Direct Memory