若是不进行垃圾回收,内存早晚都会被消耗空。所以咱们在不断的分配内存空间而且同时进行着垃圾回收操做。算法
哪些内存须要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”就是不被任何途径使用的对象。那么如何找到这些对象?spa
这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。(任什么时候刻计数值为0的对象就是不可能再被使用的。这种算法使用场景不少,可是,Java中却没有使用这种算法,由于这种算法很难解决对象之间相互引用的状况。)对象
两个对象相互引用着,可是虚拟机仍是把这两个对象回收掉了,这也说明虚拟机并非经过引用计数法来断定对象是否存活的。
这个算法的基本思想是经过一系列称为“GC Roots”的对象做为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证实此对象是不可用的。blog
方法区的垃圾回收主要回收两部份内容:1. 废弃常量。2. 无用的类。既然进行垃圾回收,就须要判断哪些是废弃常量,哪些是无用的类。内存
标记-清除算法就如同它的名字样,分为“标记”和“清除”两个阶段:首先标记出全部须要回收的对象,标记完成后统一回收全部被标记的对象。虚拟机
标记和清除两个过程的效率都不高;不连续的内存碎片,分配较大对象时,没法找到足够的连续内存效率
它将可用的内存分为两块,每次只用其中一块,当这一块内存用完了,就将还存活着的对象复制到另一块上面,而后再把已经使用过的内存空间一次性清理掉。垃圾回收
内存缩小为了原来的一半,这样代价过高了搜索
而是让全部存活对象都向一端移动,而后直接清理掉边界之外的内存引用
(新生代),使用复制算法,复制成本低;
(老年代),采用标记-清理算法或者标记-整理算法。