GC 钻研剖析
JVM 在进行 GC 时,并不是对这三个区域对立回收
●新生代
●幸存区
●老年区
GC 两品种:轻 GC(Minor GC), 重 GC(Full GC)
题目:
●JVM 的内存模型和分区~ 具体到每个区放什么?
●堆外面的分区有哪些?Eden、from、to、老年区 Old Area
●GC 的算法有哪些?标记革除法,标记压缩,复制算法,援用计数器
●轻 GC 和重 GC 别离在什么时候产生?
援用计数器
复制算法
复制算法长处:没有内存的碎片
复制算法毛病:节约了内存空间,幸存区多了一半空间永远是空的 to,假如对象 100% 存活 (极其状况下)
复制算法最佳应用场景:对象存活度较低的时候,新生区~
标记革除
长处:不须要额定的空间!
毛病:两次扫描,重大浪费时间,会产生内存碎片。
标记压缩
标记革除压缩
先标记革除五次
再压缩
总结:
内存效率:复制算法 > 标记革除算法 > 标记压缩算法 (工夫复杂度)
内存参差度:复制算法 = 标记革除算法 > 标记压缩算法
内存利用率:标记压缩算法 = 标记革除算法 > 复制算法
思考一个问题:难道没有最优算法吗?
答案:没有,没有最好的算法,只有最合适的算法
年老代:
存活率低
复制算法
老年代
区域大:存活率
标记革除(内存碎片不是太多)+ 标记压缩混合 实现
一天工夫学 JVM 不事实,要深究,必须花工夫,多看面试题,以及《深刻了解 JVM》