内存分配与回收策略
并不是所有的对象都在堆上分配,还有两个地方可以存放对象:栈和TLAB
一 对象优先在Eden分配
Minor GC和Full GC有什么不同?
Minor GC(新生代GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快
Full GC(老年代GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC。Major GC的速度一般会比Minor GC慢10倍以上
二 大对象直接进入老年代
1 大对象是指需要大量连续内存空间的Java对象,经常出现大对象容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来“安置”它们
2 虚拟机提供了一个参数,大于这个参数值的对象直接在老年代分配,这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制
例子:
三 长期存活的对象将进入老年代
1 在内存回收时就必须识别哪些对象应放在新生代,哪些对象应放在老年代,为了做到这点,虚拟机给每个对象定义了一个对象年龄计数器:如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且Survivor容纳的话,将被移动到Survivor空间中,并且对象的年龄设为1。对象在Survivor区中每“熬过”一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度,就会被晋升到老年代。(通过参数实现)
四 动态对象年龄判定
虚拟机并不是永远地要求对象的年龄必须到达了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和
五 空间分配担保
在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的;如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。
这一章要会的:
- 垃圾收集算法
- 几款垃圾收集器特点及运作原理
- 垃圾回收和垃圾收集器在很多时候同时影响系统性能,并发能力的主要因素之一