简述java垃圾回收器GC原理
程序员文章站
2022-04-16 16:33:11
垃圾回收器GC机制基本规则主要针对: 堆内存的垃圾数据回收规则:堆内存中的对象,在没有任何引用指向该对象的情况下,被GC判定为垃圾数据,此时会被GC回收;...
-
看这个前提是
:了解虚拟机内存基本结构:5个点搞定JVM内存模型(带图解)
一、垃圾回收器GC机制基本规则
- 主要针对: 堆内存的垃圾数据
- 回收规则:堆内存中的对象,在没有任何引用指向该对象的情况下,被GC判定为垃圾数据,此时会被GC回收;
那JVM具体是通过什么算法判断对象数据是否为垃圾数据呢?这就涉及到了
垃圾判断算法
二、垃圾判断算法
①引用计数法
这种算法假设堆内存中的每个对象都有一个引用计数器,当对象被创建初始化后,其引用计数器值设置为1,以后每多一次引用就+1;反之,引用结束则-1,当对象引用计数器值为0时,对象被判定为垃圾数据,可以被收集
-
优点
:引用计数法实现起来比较简单,对程序不被长时间打断的实时环境比较有利。 -
缺点
:需要额外的空间来存储计数器,难以检测出对象之间的循环引用。
②可达性分析法(JVM中使用的正是这个)
在Java
中,是通过可达性分析(Reachability Analysis)来判定对象是否存活的。该算法的基本思路就是通过一些被称为引用链
(GC Roots)的对象作为起点,从这些节点开始向外搜索,搜索走过的路径被称为(Reference Chain),当一个对象到GC Roots没有任何引用链相连时(即从GC Roots节点到该节点不可达),则证明该对象是不可用的。
注:箭头为引用链,蓝色圆圈表示引用它的对象
优点
:可以解决循环引用的问题,不需要占用额外的空间缺点
:多线程场景下,其他线程可能会更新已经访问过的对象的引用
- 在Java中,可作为GC Root的对象包括以下几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(即一般说的Native方法)引用的对象
三、垃圾回收器的线程特性
垃圾回收(GC)
线程与应用线程保持相对独立,当系统需要执行垃圾回收任务时,先停止工作线程,然后命令 GC 线程工作。以串行模式工作的收集器,称为Serial Collector,即串行收集器;与之相对的是以并行模式工作的收集器,称为Paraller Collector,即并行收集器。
既然是简述,点到为止!
~END
本文地址:https://blog.csdn.net/King_of_peas/article/details/107550249