GC的时机
在分代模型的基础上,GC从时机上分为两种:Scavenge GC 和 Full GC
Scavenge GC (Mionr GC)
触发时机:新对象生成时,Eden空间满了
理论上Eden区大多数对象会在Scavenge GC 回收,复制算法的执行效率会很高,Scavenge GC时间比较短
Full GC
整个jvm进行整理,包括Young、old和perm
主要触发时机:old满了 perm满了 system.gc()
效率很低,尽量减少Full GC
配置jvm 参数如下:
-verbose:gc 打印垃圾收集的情况
-Xms20M 最小堆大小
-Xmx20M 最大堆大小
-Xmn10M 新生代大小
-XX:+PrintGCDetails 打印GC收集详细信息
-XX:SurvivorRatio=8 eden 与 from survivor to survivor 比例 8:1:1
public static void main(String[] args) {
int size = 1024 * 1024;
byte[] myAlloc1 = new byte[2*size];
byte[] myAlloc2 = new byte[2*size];
byte[] myAlloc3 = new byte[2*size];
byte[] myAlloc4 = new byte[2*size];
System.out.println("Test1.main");
}
打印结果:
GC (Allocation Failure): Eden满了 分配失败进行GC垃圾回收
PSYoungGen: 表述 使用parallel Scavenge 收集器
ParOldGen:表示 parallel old 老年代收集器
6874K->992K(9216K) : 6874K表示回收之前存活对象在新生代的空间的容量,992K表示回收后存活对象的容量
9216K:表示新生代总空间容量大小
6874K->3337K(19456K):6874K表示对象总的堆大小,3337K执行完回收之后 存活对象总的堆大的大小
PSYoungGen:表示新生代
ParOldGen :老年代
6874-992 = 5882 //执行完GC后,新生代释放的空间的容量,新生代释放的空间 :1)被回收 2)晋升到老年代
6874-3337=3537 //执行完GC后,总的堆空间释放的容量
5882-3537=2345 //等于ParOldGen 老年代容量
[GC (Allocation Failure) [PSYoungGen: 6874K->992K(9216K)] 6874K->3337K(1945