将servlet[loginservlet]标记为不可用_网友提问JVM-GC回收机制?今天就彻底讲解一下GC回收机制到底咋用...

d234d6f32bb875c856092e0c588f3eb5.png

欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!

Java架构筑基​zhuanlan.zhihu.com
97589d03309db9ed3c5ba063c850562f.png
  • Java架构筑基——专注于Java技术的研究与分享!
  • 后续文章将首发此专栏!
  • 欢迎各位Java工程师朋友投稿和关注
  • # 链接 Java程序员福利"常用资料分享"

在 JVM 中 GC 的回收机制也是非常重要的一块,废话不多说,先上张图

64dcad5aff099517a2962ba8e4ac9be6.png

一、如何确定垃圾

①. 引用计数法

每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。

②. 可达性分析

为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的GC roots对象作为起点搜索。如果在GC roots和一个对象之间没有可达路径,则称该对象是不可达的

要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。

1. GC对象标记过程

第一次标记:

  • 如果对象在可达性分析后没有与GC Roots相连接的引用链,将第一次被标记,并进行一次筛选,筛选条件为是否有必要执行finalize()方法
  • 没有必要执行finalize()方法,便将这对象放置F-Queue队列中,并在稍后由一个虚拟机自动建立的、低优先级的Finalizer线程去执行它(指触发这个方法);
  • "没必要执行"的两种情况:当对象没有覆盖finalize(),或者此方法已经被虚拟机调用过

第二次标记:

  • 稍后GC将对F-Queue中的对象进行第二次标记,如果对象在finalize()方法中成功拯救自己(重新与引用链上的任一对象建立关联),它将被移出“即将回收”集合,否则,被回收
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值