一 堆空间的参数设置
-
-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)