1.在进行GC资源清除之前,首先要确认对象是否死亡,针对判断死亡与否,在Java用到了可达性分析的方法,通过GC Roots向下搜索,如果没有搜索到。则认为该对象不会再使用,可回收。
GC Roots一般包括虚拟机栈中引用的方法,本地方法区静态实体引用的对象,方法区常量引用的对象
在Java中引用可达性分析,而在python中不仅使用到了可达性分析,还使用到了引用计数,每一个对象都有一个引用计数的属性,每当新增一个引用时,计数+1,每当释放一个引用,计数-1,当计数为0,则认为可以被GC
2.GC机制中用到了几种算法,以下介绍最主要的四种算法
①:标记-清除算法:
给每个对象储存一个标记位,记录每个对象的状态,,分别分了两个阶段,第一个阶段就是动态的更新对象的状态,确认对象是否存活,第二个阶段就对状态为死亡的对象进行GC,它仅仅是对死亡的对象进行去除,会导致出现大量内存碎片,直接导致内存的一个浪费。
②:标记-整理算法:
标记整理是在标记清理做的优化,针对标记为存活的对象进行整理,类似于顺序表中间删除元素,将存活的元素整理到一起,减少了内存碎片的产生,但是整理降低了性能
③:复制算法:
复制算法是将内存划分为两个部分,每次放入引用仅放在一个部分,当GC时,将标记为存活的对象复制到另一个区域中,然后删除原来区域中的所有对象,依次循环刚刚的操作,对象在两个区域中来回切换,也因此内存减少了一半
④:分代收集算法:
在JVM中,虚拟机栈,程序计数器和本地方法栈都是随线程的生命周期生存和灭亡,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动内存清理操作,所以GC主要集中于Java堆和方法区,而分代收集就主要用于JVM的堆和方法区
将对象的生命周期划分为两个部分,新生代和老年代
新生代又分为伊甸区和幸存区(幸存区包含from和to两个部分)
当新生代触发Younger GC,首先在伊甸区进行GC,GC的存活对象进入幸存区,在幸存区两个部分进行复制算法,GC一定次数后,进入老年代,进入老年代
在老年代也会发生定期的GC,一般当老年代满了,或者方法区满了,或者显性调用System.gc()会触法Full GC
垃圾回收机制
最新推荐文章于 2024-09-07 21:58:00 发布