GC Log常用命令
**1)查看GC基本信息 **
在JDK 9之前使用-XX: +PrintGC, JDK 9 后使用 -Xlog: gc
**2)查看GC详细信息 **
JDK 9之前使用 -XX: +PrintGCDetails, 在JDK 9之后使用-X-log: gc
**3)查看GC前后的堆、 方法区可用容量变化 **
JDK 9之前使用-XX: +PrintHeapAtGC, JDK 9之后使用 -Xlog: gc+heap=debug
**4)查看GC过程中用户线程并发时间以及停顿的时间 **
JDK 9之前使用-XX: +PrintGCApplicationConcurrentTime以及
-XX: +PrintGCApplicationStoppedTime,
JDK 9之后使用-Xlog:safepoint
**5)查看收集器Ergonomics机制( 自动设置堆空间各分代区域大小、 收集目标等内容, 从Parallel收
集器开始支持) 自动调节的相关信息 **
在JDK 9之前使用 -XX: +PrintAdaptive-SizePolicy, JDK 9之后使用-Xlog: gc+ergo*=trace
**6)查看熬过收集后剩余对象的年龄分布信息 **
在JDK 9前使用-XX: +PrintTenuring-Distribution,JDK 9之后使用-Xlog: gc+age=trace
内存分配与回收策略
- 对象优先在Eden区进行分配, Eden区没有足够空间时将发生一次Minor GC。如果Eden区没有空间存放则在Survior区进行分配,如果Survior区没有空间进行分配担保机制提前转移到老年代中。
例: -Xms20M -Xmx20M -Xmn10M 即 JAVA堆大小为20MB,新生代10M,老年代10M 默认Eden:from:to 是 8:1:1,则Eden区8M,from,to 各 1M 执行代码如下: public class Test { public static void main(String[] args) { byte[] b1 = new byte[1024 * 2]; //2M byte[] b2 = new byte[1024 * 2]; //2M byte[] b3 = new byte[1024 * 4]; //2M byte[] b4 = new byte[1024 * 4]; //4M } }
- 大对象直接进入老年代
指需要大量连续内存空间的对象,如:长字符串、庞大的数组 - 长期存活的对象进入老年代
Survivor区通过标记-复制算法GC次数达到一定次数(默认15次),则直接进入老年代中
特殊通过如下配置可以配置达到多少次数进入老年代 -XX: MaxTenuringThreshold=10
- 动态对象年龄判定
如果Survivor空间相同年龄所有对象的大小总和 > Survivor * 1/2,则年龄大于或等于该年龄的对象直接进入老年代 - 空间分配担保
新生代中有大量的对象存活,survivor空间不够,当出现大量对象在MinorGC后仍然存活的情况(最极端的情况就是内存回收后新生代中所有对象都存活),就需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代.只要老年代的连续空间大于新生代对象的总大小或者历次晋升的平均大小,就进行Minor GC,否则FullGC。
注意:数组和集合在使用完之后要进行置空操作,不然会占用空间,应当让GC回收掉,避免内存泄漏问题 ,如ArrayList源码中的remove方法
上一篇:JVM_概念_回收算法_JVM学习笔记(一)
下一篇:JVM_诊断工具使用及实战_JVM学习(三)