Java的垃圾回收机制(GC):
1、引用计数算法
2、跟踪回收方法
3、压缩回收算法
4、复制回收算法
5、按代回收算法
Java的垃圾回收机制(GC):
GC(Garbage Collection)--回收不再使用的内存
GC负责3项任务:分配内存、确保引用、回收内存
GC回收依据--当对象没有任何作用,则可以被回收。
垃圾回收是双刃剑:
1,对程序开发提供了便捷,
2,垃圾回收要对程序进行不断的监听,所以执行效率,相对于C、C++要低一些。不过随着技术发展和软硬件技术的提高,差距在不断的缩小。
垃圾回收器--使用的是有向图的方式管理和记录,堆内存中的所有对象。通过有向图可以识别哪些对象时可达的。哪些对象是不可达的。对于可达的对象进行保留,不可达的对象视为垃圾,被垃圾回收器处理掉。
垃圾回收(GC)算法:常用的5种算法
1,引用计数算法--最简单,但效率也最低。原理是,JVM堆中保存的每一个对象都有一个被引用1计数器,当有变量引用对象时,计数器就会“+1”。当变量被释放或断开引用时,计数器就会“-1”。当计数器变成“0”则表示这个对象可以被垃圾回收。
(注意:当两个对象彼此互相引用,会形成一个循环。称为循环引用,计数器是无法解决循环引用的情况的)
2,跟踪回收算法:利用JVM维护的对象引用图(可以形象的理解为JVM在内存中画了一张图,从根节点开始遍历对象的引用图。同时标记还可以遍历到的对象。遍历结束后未被遍历的对象就是没被使用的对象,就是不能使用的对象,就可以进行回收了)
3压缩回收算法:将JVM堆中活动的对象放到一个集中的区域中,在堆的另外一端留出大块空闲区域,相当于对堆中的碎片进行处理。(对性能影响较大)
4,复制回收算法--把 堆 分成两个形同大小的区域,在任何时刻只有其中的一个区域被使用,直到其被消耗完。然后垃圾回收器会阻断程序的运行,通过遍历把所有活动的对象复制到另外一个区域中,复制时这些对象时紧密的挨在一起的。从而消除在内存中产生的碎片。复制完成后继续运行,知道区域使用完,然后重复上面的方法。
(优点:在垃圾回收的同时,也完成了对对象的重新布置和安排,因为对象都是紧密连接的所以其访问效率和寻址效率都非常高。并且一次性解决的内存碎片问题。
但是也有它自己的问题,
1,需要指定内存到小的2倍。
2,在内存调整的过程需要中断当前程序的执行,降低了程序的执行效率
5、按代回收算法(现在的主流回收算法):
如果按对象生命周期的长短进行区分,绝大多数对象的声明周期都很短。比如方法中声明的对象,方法结束这个对象就被释放了。只有很少的部分对象有较长的生命周期。例如:全局变量、一些需要一直持有易用的变量才拥有较长的声明周期。
基于上述特点,按代回收算法进行了优化,思路为--把堆分成两个或者多个子堆。每个子堆都视为一代。回收算法在运行时,优先回收年轻的对象
对于一些经过多次回收依然存活的,则把其移到高一级的堆中。
这种按代分类的做法,我们可以把一些稳定的不常用的类,减少扫描次数。进而缩小扫描范围,提升了回收的效率。