1.什么是垃圾
- 没有引用指向的一个对象或一堆对象
2.垃圾怎么找到它
- 两种算法:1.Reference Count(引用技术)
- 2.Root Seaching(根可达算法)
3.GC常用垃圾清除算法(3种)
- 标记清楚:有碎片,效率偏低,位置不连续(两遍扫描)
- 拷贝算法:浪费空间,没有碎片,
- 标记压缩:效率偏低,没有碎片,也不会浪费空间(效率偏低,指针需调整)
4.堆内存逻辑分区
新生代:新new出来的对象都在,分为伊甸区(刚诞生的对象)和survivor(幸存)区(回收一次跑到这回收一次跑到这)(默认8:1:1),因为新生代活着的对象比较少,大量对象死去,所以用拷贝算法。
老年代:冥顽不固,回收不掉的对象都在这(新老:1比3),因为存活对象比较多,采用标记清除或者标记压缩算法。
5.栈上分配
6.对象如何进入老年代
伊甸区+S1——》进行YGC的时候,拷贝的对象超过S2对象的一半了,那么把这些年龄最大的对象直接放进老年代
分配担保:YGC的时候survivor空间不够了,分配担保直接进入老年代
7.常见的垃圾回收器
Serial;Serial Old(safe point)一旦开始回收,安全停止掉其它线程,清完后,其他线程继续工作
Paralle Scavenge; Parallel Old(默认)与Serial唯一区别就是多线程清理垃圾
CMS;ParNew(Paralle Scavenge新版本)做了增强,以后便于CMS配合使用的变种
以上都能组合并且逻辑和物理上都分新生代和老年代
Serial:单线程
Paralle Scavenge:多线程
G1:逻辑上分新生代和老年代,物理上不区分
CMS:四个阶段
8.CMS的问题
MARK Sweep 天生问题(碎片化)
- 1. 碎片太多,老年代满满了,新来的对象没地方放了
- 2.浮动垃圾