JVM垃圾回收《引用计数法和可达性分析法》

1.垃圾回收的概述

1.1如何判断对象可以被回收

在JVM里面,要判断一个对象是否可以被回收,最重要的是判断这个对象是否还在被使用,只有没被使用的对象才能回收。

1.1.1引用计数法(用的比较少)

网友神比喻:左脚踩右脚能上天系列
引用计数法的思想是让每个对象记录下有多少程序引用自己,并且让没有被引用的对象自动消失。
引用计数法诞生于1960年,由George E. Collins创造。
缺点:老算法,比较消耗内存,比较难处理循环引用。因为运用了计数器,每次都要计数所以比较消耗。

假设A对象用了一次就给它一个计数器为1,假设对象B用了俩次给它计数器为2,假设对象C一次也没有用它的计数器为0,那么对象C就会被垃圾回收进行清除。但是如果A和B互相引用就不会被清除,这样的多了就会造成内存泄露的问题。

1.1.2可达性分析算法

网友神比喻:拿起葡萄掉下去的就可以吃了
它的主要流程是,先对堆内存中的所有对象进行一遍扫描,
确定一系列肯定不能回收的对象作为GC root,
比如虚拟机栈里面的引用对象、本地方法栈引用的对象等
然后以GCROOT作为起始节点,从这些节点开始向下搜索,去寻找它的直接和间接引用的对象,
当遍历完之后如果发现有一些对象不可到达那么就认为这些对象已经没有用了,需要被回收。
在垃圾回收的时候,JVM会首先找到所有的GC root,这个过程会暂停所有用户线程,也就是stop the world,然后再从GC Roots这些根节点向下搜索,可达的对象保留,不可达的就会回收掉。

1.1.2.1哪些对象可以作为GC root

(1). 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。

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

(3). 方法区中常量引用的对象。

(4). 本地方法栈中JNI(Native方法)引用的对象。

1.1.2.2图解可达性分析算法

JVM垃圾回收《引用计数法和可达性分析法》_第1张图片

你可能感兴趣的:(JVM,jvm,java,算法)