java可达性_Java 垃圾回收 - 可达性分析算法

续前节,前面总结了Java内存运行时区域划分的各个部分,分别:JVM虚拟机栈、本地方法栈(JDK Native方法执行所需)、程序计数器、堆内存、方法区、方法区常量池。其中JVM 虚拟机栈、本地方法栈、程序计数器3个区域会随线程而生,随线程而死。栈帧中的操作随着方法区的进入和推出进行相关的入栈和出栈操作。每个栈帧的大小随着方法结构而确定下来的。

1、对象生死确定

堆内存存放着一个程序中所需的所有实例对象。垃圾回收机制主要针对堆内存进行回收。在执行回收之前首先要确定对象是否还在被引用。

普遍判断对象是否存活的方法是通过引用计数法,指的是:当对象被引用,程序计数器+1;释放-1;当为0时证明对象未被引用。可回收。但是Java中并未采用次方法。

Java采用可达性分析法 来确认对象是否存活。

所谓可达性分析法是指的,通过一些列称之为“GC Roots” 的对象作为起点;从此起点向下搜索,所走过的路径称之为引用链,当一个对象到 GC Roots 没有任何引用链相连接,代表此对象不可达。

如图所示:

98540f1b93fd1fbcdda13558664df4d8.png

Java 可以作为GC Roots 的对象包括:

虚拟机栈(帧栈中的本地变量表)中的引用对象。

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

方法区中常量引用的对象

本地方法栈中JNI (即一般说的 Native 方法) 的引用对象

2、Java 引用

java中把内存中对象的引用分成了四个等级,在不同程度下进行垃圾的回收工作。按照回收优先级顺序分为:虚引用 -> 弱引用 -> 软引用 -> 强引用。如下图

ca5f1b65eedb0e8e27fa2ab03307d07d.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值