JVM--垃圾收集算法

来源:互联网 发布:js去除字符串中的符号 编辑:程序博客网 时间:2024/05/18 04:00

一、如何判断对象是否存活?

在通常情况下,如果我们被问到如何判断一个对象是否存活这个问题的时候,我们通常会想到引用计数算法,那么除了引用计数算法之外还有没有其他的算法呢?当然,而且就目前来说引用计数算法用得并不是很多。

(1)引用计数算法

引用计数算法需要给对象添加一个技术器,当指向对象的引用增加的时候,相应对象的引用计数器就加一,当垃圾回收开始的时候,判断对象的引用计数器的值是否为0,如果为0就将对象回收掉。当然我们会发现针对循环引用的情况,引用计数器就歇菜了。那么有没有办法可以解决循环引用的问题呢?当然,这就是我们下面要说到的可达性分析算法。

(2)可达性分析算法

在可达性分析算法中有一个很重要的东西“GC Roots”,当我们从GC Roots到一个对象所走过的路径称为引用链,当没有到达对象的引用链的时候,这个对象就可以被回收掉了。

可以作为GC Roots的对象包括以下几个对象:

虚拟机栈中引用的对象。

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

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

二、垃圾收集算法

(1)标记-清除算法

首先标记出需要被清除的对象,然后在对象回收的时候,针对被标记的对象进行统一地垃圾回收。这个算法有一个缺点就是会造成内存中有很多分散的内存块。这样一来针对比较大的对象的存储就会面临着内存不够的问题。

(2)复制算法

复制算法通常会把内存分成两个区域,使用其中的一个区域,当进行垃圾收集的时候将存活的对象复制到另一个空的区域,然后将当前区域进行回收,这样就不会造成零碎的内存空间。

(3)标记-整理算法

标记整理算法是将存活的对象移向一边,然后回收另一边即可。这个算法和标记-清除算法有点类似,但是不同的是这个算法有个移动的过程。

原创粉丝点击