什么是垃圾回收?
垃圾回收是指把没用的对象所占的内存释放,给其他对象使用。
怎么确定一个对象是否还有用?
一种算法是引用计数法,计数器为0对象没用,否则对象还在使用,这种方法的一个缺点;两个对象互相引用,则计数器永远不为0,也就无法释放内存。另一种算法是根搜索算法。从gc root对象出发,寻找引用的节点,当所有节点搜索完毕,没被引用的节点就是无用的节点。
几种常见的垃圾回收算法:
标记-清除算法:标记所有无用节点然后清除,实现起来比较容易,缺点容易产生内存碎片。
标记-整理算法:和标记清除算法类似,只是标记后先把存活对象向一端移动,然后再清除边界外的对象。
复制算法:内存分为两块,每次使用一块,满了之后将存活对象复制到另一块内存上。解决了内存碎片问题,缺点如果每次存留的对象多的话,内存开销大。
分代收集算法:根据对象的存活周期划分不同的内存区域。年轻代、年老代、持久代 年轻代copying算法,年老代标记-整理算法,持久代存放一些class 常量等。年轻代分为eden survivor0 survivor1,对象从Eden出生,发生minor gc时,Eden和survivor from的存活对象复制到survivor to区,清除eden 和survivor区,survivor存满或对象生命周期带到阈值会提升到年老代。年老代满时发生full gc.