⑤. 复制算法
- ①. 一般过程(图解)
②. 复制算法详解 掌握
(伊甸园满了,就会触发gc(minor gc),而gc就会把标识为垃圾的对象干掉,不是垃圾的对象就要转移到幸存区,把伊甸园让出来给新的对象用)
过程:
⑥. Minor GC | Major GC | Full GC
①. YONG GC(minor GC):发生在新生代
只针对新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不
高,所以Minor GC非常频繁,一般回收速度也比较快
当Eden代满,会触发minor GC ,Survivor 满不会引发GC
minor gc 会引发STW,暂停其他用户线程,等垃圾回收结束,用户线程才能恢复
②. Major GC:发生在老年代
major GC 是回收老年代的垃圾;major gc 的速度一般比Minor gc 慢10倍以上,STW时间更长
③. Full GC:发生在
full GC 就会出现所谓的STW(stop the world)现象,即所有的进程都挂起等待清理垃圾
full GC是回收老年代和年轻代的垃圾
full gc 是开发调优中尽量避免的,这样暂时时间会短一些
④. 全局GC(major GC or Full GC):
(指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但并
不是绝对的)。Major GC的速度一般要比Minor GC慢上10倍以上)
⑦. 针对不同年龄阶段的对象分配原则
①. 优先分配到Eden
②. 大对象直接分配到老年(尽量避免程序中出现过多的大对象)
③. 长期存活的对象分配到老年代
④. 动态对象年龄判断
(如果Survivor 区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄对象可以直接进入老年代,无须等到MaxTenurningThreshold中要求的年龄)
⑤. 空间分配担保 -XX:HandlePromotionFailure
(JDK6之后,只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC)
⑧. TLAB(Thread Local Allocation Buffer)
①. 从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内
②. 尽管不是所有的对象实例都能够在TLAB中成功分配内存,但JVM确实是将TLAB作为内存分配的首选
③. 默认情况下,TLAB空间的内存非常小,仅占有整个Eden空间的1%,当然可通过选项"-XX:TLABWasteTargePercent"设置TLAB空间所占用Eden空间的百分比大小
④. 一旦对象在TLAB空间分配内存失败时,JVM就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存
⑤. 图解: