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...:
2.在VM options项,添加值:
说明当下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"); } }
运行结果:
如果我们设置堆最大内存为1M,初始内存也为1M时:
运行程序,内存不足报错(OutOfMemoryError):
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 。
总结