垃圾回收

谭佳成
2018-08-13
(33)

# Garbage Collection,简称GC,中文名"垃圾回收"。是和计算机内存管理有关的概念,这里面的垃圾指的是程序不用的内存空间。


## 计算机软件一键点击清理内存,但是具体实现呢?


- 主要思路:找到并确定 **不用** 的内存,回收供其他程序使用


## 如何找到 **不用** 的垃圾


- 引用计数算法


给对象中增加一个引用计数器,每当有一个地方引用他时,计数器就加1,当引用失效时,计数器值就减1。当执行垃圾回收时,只需要判断这个对象的引用计数器的数值是不是0就可以了。如果引用计数器数值为0,则表示可以回收。

优点:比较简单

缺点:存在循环引用对象,将导致无法回收。


- 可达性分析算法


通过一系列的"GC Root"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用链,当一个对象到GC Root没有任何引用链相连时,则证明此对象是不可用的。


一个物品,没有任何家庭成员宣布需要还要继续使用。就像一个对象,到达所有的"GC Root"都没有引用链是一样的。


在Java语言中,可以作为GC Root的对象包括以下几种:


1、虚拟机栈中引用的对象。


2、方法区中类静态属性引用的对象。


3、方法区中常量引用的对象。


4、本地方法栈中JNI引用的对象。


- 垃圾的宿命


一般情况下,要宣告一个对象死亡,至少要经过两次标记过程:


1、经过可达性分析后,一个对象并没有与GC Root关联的引用链,将会被第一次标记和筛选。筛选条件是此对象有没有必要执行finalize()方法。如果对象没有覆盖finalize()方法,或者已经执行过了。那就认为他可以回收了。如果有必要执行finalize()方法,那么将会把这个对象放置到F-Queue的队列中,等待执行。


2、虚拟机会建立一个低优先级的Finalizer线程执行F-Queue里面的对象的finalize()方法。如果对象在finalize()方法中可以『拯救』自己,那么将不会被回收,否则,他将被移入一个即将被回收的对象集合。


对象如何在finalize()中『拯救』自己呢?


最简单的方式就是重新简历引用,比如把自己赋值给某个类变量或者对象的成员变量。


如无说明,本站文章均为原创,转载或引用注明来源:https://93jc.cn/article/160.html