1 对象优先在eden 分配
注意Minor GC 和Full GC 区别
新生代GC(Minor GC) :指发生在新生代的垃圾回收动作 ,因为java大多数对象都具有朝生夕灭的特点,所以Minor GC 非常频繁 ,回收效率也比较快
老年代GC(Full GC/Major GC) :指发生在老年代的垃圾回收动作,一旦出现了MajorGC 通常带有一次的MinorGC (但不一定绝对) . MajorGC 一般会比MinorGC快10倍以上
2 大对象直接进入老年代 大对象: 连续内存空间的java对象
例外 :若出现朝生夕灭且大对象的情况, 在新生区采用复制算法收集内存的同时,进入了老年代.那么产生了新老拷贝的情况出现,而虚拟机给了一种可以调节的方法 --XX:PretenureSizeThreshold参数,让大于这个参数的值直接进行老年代,这样就避免在Eden和survivor区直接发生大内存的拷贝
注意:PretenureSizeThreshold参数 只对Serial 和ParNew 两块收集器有效
3长期存活的对象直接进入老年代 那么如何判断这个对象是否长期存活的标准呢? java虚拟机在这里有一定的规则规范 ----对象年龄计数器 当对象每次在Minor GC 存活 , 并能被Survivor容纳的话 对象年龄为1 并且每次在survivor经历一次MinorGC 年龄就加一岁 ,默然到达15岁就直接进入老年代
通过--XX:MaxTenuringThreshold 来进行设置
4 动态年龄的判定
如果在Survivor空间相同年龄所有对象大小总和大于Survivor空间的一半 ,年龄大于或等于就可以直接进行老年代无须等到MaxTenuringThreshold 的值
5空间搭配担保 在发生MinorGC的时候,虚拟机会进行检测 每次晋升到老年代平均大小是否大于老年代的剩余空间大小,如果大于这进行FULLgc