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

垃圾回收在JVM中用于判断和回收不再使用的对象。引用计数法是一种早期策略,但难以处理循环引用。可达性分析算法是现代JVM常用的方法,通过GCroot确定活跃对象,不可达的对象将被回收。GCroot包括虚拟机栈、方法区的静态属性和常量引用、本地方法栈的JNI引用。

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图解可达性分析算法

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值