堆空间的参数设置

本文深入解析了Java虚拟机(JVM)的堆空间参数设置,包括初始值、最终值的查看,以及新生代、老年代、Survivor区的配置。详细介绍了空间分配担保机制及其在不同JDK版本中的变化。通过实例展示了参数如-XX:SurvivorRatio的影响,并通过GC日志展示了内存使用情况和Full GC触发条件。内容涵盖了JVM调优的关键知识点,对于理解Java内存管理和优化具有指导意义。
摘要由CSDN通过智能技术生成

一 堆空间的参数设置

  • -XX:+PrintFlagsInitial:查看所有的参数的默认初始值

  • -XX:+PrintFlagsFinal:查看所有的参数的最终值(可能会存在修改,不再是初始值)

  • -Xms:初始堆空间内存(默认为物理内存的1/64)

  • -Xmx:最大堆空间内存(默认为物理内存的1/4)

  • -Xmn:设置新生代的大小。(初始值及最大值)

  • -XX:NewRatio:配置新生代与老年代在堆结构的占比

  • -XX:SurvivorRatio:设置新生代中 Eden 和 S0/S1 空间的比例

  • -XX:MaxTenuringThreshold:设置新生代垃圾的最大年龄

  • -XX:+PrintGCDetails:输出详细的GC处理日志

  • -XX:+PrintGC(-verbose:gc):打印gc简要信息,两个参数输入效果一样

  • -XX:HandlePromotionFalilure:是否设置空间分配担保

二 空间分配担保理解

在发生 Minor GC 之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。

- 如果大于,则此次 Minor GC是安全的

- 如果小于,则虚拟机会查看-XX:HandlePromotionFailure 设置值是否允担保失败。

  - 如果 HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。

    - 如果大于,则尝试进行一次 Minor GC,但这次 Minor GC 依然是有风险的。

    - 如果小于,则改为进行一次 FullGC。

  - 如果 HandlePromotionFailure=false,则改为进行一次 Full Gc。

在 JDK6 Update24(JDK7) 之后,HandlePromotionFailure 参数不会再影响到虚拟机的空间分配担保策略,观察 openJDK 中的源码变化,虽然源码中还定义了 HandlePromotionFailure 参数,但是在代码中已经不会再使用它。

JDK6 Update 24(JDK7)之后的规则变为:只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行 Minor GC,否则将进行FullGC。

这个参数失效了,或者把这个参数理解为 true。

三 参数设置参考

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

四 实战

1 代码

/**
* 测试堆空间常用的 jvm 参数:
* -XX:+PrintFlagsInitial : 查看所有的参数的默认初始值
* -XX:+PrintFlagsFinal  :查看所有的参数的最终值(可能会存在修改,不再是初始值)
* <p>
* 具体查看某个参数的指令:
* 1 jps:查看当前运行中的进程
* 2 jinfo -flag SurvivorRatio 进程id
* <p>
* -Xms:初始堆空间内存 (默认为物理内存的1/64)
* -Xmx:最大堆空间内存(默认为物理内存的1/4)
* -Xmn:设置新生代的大小。(初始值及最大值)
* -XX:NewRatio:配置新生代与老年代在堆结构的占比,默认是2,新生代是1,老年代是2
* -XX:SurvivorRatio:设置新生代中Eden和S0/S1空间的比例,默认是8,S0/S1是1,Eden是8
* -XX:MaxTenuringThreshold:设置新生代垃圾的最大年龄,默认是15
* -XX:+PrintGCDetails:输出详细的GC处理日志
* 打印 gc 简要信息:下面两个参数输出效果一样
* ① -XX:+PrintGC
* ② -verbose:gc
* -XX:HandlePromotionFailure:是否设置空间分配担保
*/
public class GCTest {
    public static void main(String[] args) {
        int i = 0;
        try {
            List<String> list = new ArrayList<>();
            String a = "cakin";
            while (true) {
                list.add(a);
                a = a + a;
                i++;
            }
        } catch (Throwable t) {
            t.printStackTrace();
            System.out.println("遍历次数为:" + i);
        }
    }
}

2 参数设为 -XX:+PrintFlagsInitial -XX:SurvivorRatio=5 的测试结果

3 参数设为 -XX:+PrintFlagsFinal -XX:SurvivorRatio=5 的测试结果

4 参数设置为 -Xms100m -Xmx100m -XX:+PrintGCDetails

[GC (Allocation Failure) [PSYoungGen: 24048K->3923K(29696K)] 24048K->11291K(98304K), 0.0056268 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 24899K->3792K(29696K)] 32267K->26528K(98304K), 0.0080014 secs] [Times: user=0.03 sys=0.02, real=0.01 secs]
[Full GC (Ergonomics) [PSYoungGen: 25281K->0K(29696K)] [ParOldGen: 63696K->41739K(68608K)] 88977K->41739K(98304K), [Metaspace: 3261K->3261K(1056768K)], 0.0101722 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) --[PSYoungGen: 20480K->20480K(29696K)] 62219K->82699K(98304K), 0.0038157 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 20480K->0K(29696K)] [ParOldGen: 62219K->62219K(68608K)] 82699K->62219K(98304K), [Metaspace: 3261K->3261K(1056768K)], 0.0037190 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 0K->0K(29696K)] 62219K->62219K(98304K), 0.0004432 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(29696K)] [ParOldGen: 62219K->62200K(68608K)] 62219K->62200K(98304K), [Metaspace: 3261K->3261K(1056768K)], 0.0102485 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
遍历次数为:21
Heap
PSYoungGen      total 29696K, used 758K [0x00000000fdf00000, 0x0000000100000000, 0x0000000100000000)
  eden space 25600K, 2% used [0x00000000fdf00000,0x00000000fdfbdaa8,0x00000000ff800000)
  from space 4096K, 0% used [0x00000000ff800000,0x00000000ff800000,0x00000000ffc00000)
  to   space 4096K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x0000000100000000)
ParOldGen       total 68608K, used 62200K [0x00000000f9c00000, 0x00000000fdf00000, 0x00000000fdf00000)
  object space 68608K, 90% used [0x00000000f9c00000,0x00000000fd8be0a0,0x00000000fdf00000)
Metaspace       used 3293K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 356K, capacity 388K, committed 512K, reserved 1048576K
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at com.atguigu.java.chapter08.java1.GCTest.main(GCTest.java:18)

5 参数设置为 -Xms100m -Xmx100m -XX:+PrintGC 或 -Xms100m -Xmx100m -verbose:gc

[GC (Allocation Failure)  23728K->11259K(98304K), 0.0052876 secs]
[GC (Allocation Failure)  32234K->26592K(98304K), 0.0087120 secs]
[Full GC (Ergonomics)  89043K->41739K(98304K), 0.0091134 secs]
[GC (Allocation Failure) -- 62219K->82699K(98304K), 0.0036048 secs]
[Full GC (Ergonomics)  82699K->62219K(98304K), 0.0042520 secs]
[GC (Allocation Failure)  62219K->62219K(98304K), 0.0007173 secs]
[Full GC (Allocation Failure)  62219K->62199K(98304K), 0.0101289 secs]
遍历次数为:21
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at com.atguigu.java.chapter08.java1.GCTest.main(GCTest.java:18)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值