02 JVM 从入门到实战 | 什么样的对象需要被 GC

引言

上一篇文章 JVM 基本介绍 我们了解了一些基本的 JVM 知识,本篇开始逐步学习垃圾回收,我们都知道既然叫垃圾回收,那回收的就应该是垃圾,可是我们怎么知道哪些对象是垃圾呢? 哪些对象需要被回收? 什么时候需要回收呢?

判断算法

引用计数算法

给每个对象设置一个计数器,每当该对象被引用时引用计数器加 1,有引用断开时引用计数减 1。当引用计数为 0 时表示该对象可以被回收。

这个可以用数据算法中的图形表示,对象 A-对象 B-对象 C 都有引用,所以不会被回收,对象 B 由于没有被引用,没有路径可以达到对象 B,对象 B 的引用计数就就是 0,对象 B 就会被回收。

优点

客观地说,引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软公司的 COM(Component Object Model)技术、使用 ActionScript 3 的 FlashPlayer、Python 语言和在游戏脚本领域被广泛应用的 Squirrel 中都使用了引用计数算法进行内存管理。

缺点

主流的 Java 虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。因为相互引用,计数器值永远也不会成为 0 ,所以永远达不到被 GC 回收的条件。

例如下图:对象A,对象B 循环引用,没有其他的对象引用A和B,则A和B 都不会被回收。

可达性分析算法

该算法的原理是:以 GC Roots 的对象作为起始点,然后以该节点为基准开始向下搜索,搜索过程中搜索路径我们称之为引用链,当一个对象到 GC Roots 没有任何引用链连接的时候,说明该对象是不可用的。

注意:我们在 上边的所说的引用都是指定的强引用关系。

因为我们知道 Java 中存在四种引用对象,根据引用强度(从上至下依次减弱)可依次划分为:

  • 强引用 Strong Reference
  • 软引用 Weak Reference
  • 弱引用 Phantom Reference
  • 虚引用 Soft Reference

详细的概念大家下去可以自行查看,此处不再赘述。

可以用作 GC Roots 的对象
  • 方法区 : 类静态变量引用的对象
  • 方法区 : 常量引用的对象
  • 虚拟机栈 : 本地变量表中引用的对象
  • 本地方法栈 : JNI (带 Native 关键字)引用的对象

如下图,对象 D 和根对象之间毫无引用链,则会被回收。

由于这种算法即使存在互相引用的对象,但如果这两个对象无法访问到根对象,还是会被回收。如下图:对象 C 和对象 D 互相引用,但是由于无法访问根节点,还是会被回收。

不可达是不是就一定会被回收?

答案是不一定。

一个对象在真正被回收之前,需要经历两次标记过程:

第一次标记:

如果对象在进行可达性分析之后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 finalize() 方法,此时分两种情况:

  • 对象没有覆盖 finalize() 方法
  • finalize() 方法已经被虚拟机调用过

在这两种情况下虚拟机都认为此时没有必要执行垃圾回收。

第二次标记:

在第一次标记判定基础之上,如果判定为有必要执行 finalize() 方法,则虚拟机会把这个对象放置到一个叫做 F-Queue 的队列之中,并在之后用 Finalizer 线程去执行回收。(此处的执行指的是 虚拟机会去触发这个方法,但是并不保证回收成功,也不承诺会等待他运行结束,因为如果有个别对象在 finalize() 方法中执行缓慢甚至发生死循环的时候,有可能会导致 F-Queue 队列中的其他对象发生永久等待,最后导致整个垃圾回收系统崩溃)

总结

  • 引用计数法:简单高效,但是对于相互循环引用的对象无法判断是否应该被回收
  • 可达性分析:目前大多虚拟机厂商采用的垃圾回收算法,通过判断其他对象是否和根节点之间存在引用链来分析是否应该被回收
  • 不可达的对象不一定会立即被回收

原文地址:https://www.cnblogs.com/zhoudl/p/10551136.html

时间: 2024-08-03 18:06:05

02 JVM 从入门到实战 | 什么样的对象需要被 GC的相关文章

03 JVM 从入门到实战 | 简述垃圾回收算法

引言 之前我们学习了 JVM 基本介绍 以及 什么样的对象需要被 GC ,今天就来学习一下 JVM 在判断出一个对象需要被 GC 会采用何种方式进行 GC.在学习 JVM 如何进行垃圾回收方法时,发现所谓的 JVM 垃圾回收思想和现实生活的场景有很多相似的地方.所以本文用餐厅回收餐桌的方式类比 JVM 垃圾回收算法,应该能帮助 JVM 学习的理解和记忆. 经典垃圾回收算 标记-清除(Mark-Sweep) 研发园开了家新餐厅,餐厅老板在考虑如何回收餐盘时首先使用了最简单的方式,那就是服务员在顾客

Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程内容包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.性能调优.高并发.to

物联网开发入门+项目实战视频博学全套

物联网开发入门+项目实战视频博学全套物联网网络编程项目实战视频课程以目前在物联网中比较热门的技术平台为依据,实操为主,理论讲解为辅;引导学员...适用人群对物联网通讯感兴趣的技术人员或在校工科类学生:具备一点C语言基础.课程简介物联网网络编程项目实战视频课程以目前在物联网中比较热门的技术平台为依据,实操为主,理论讲解为辅:引导学员去进行一些简单项目的开发和练习,尽可能通俗的讲解物联网所涉及到的协议.课程大致目录:第1阶段 学前准备01 C语言及程序设计快速入门02 嵌入式C语言高级---语法概述

TensorFlow快速入门与实战

课程目录:01.课程内容综述02.第一章内容概述03.TensorFlow产生的历史必然性04.TensorFlow与JeffDean的那些事05.TensorFlow的应用场景06.TensorFlow的落地应用07.TensorFlow的发展现状08.第二章内容概述09.搭建你的TensorFlow开发环境10.HelloTensorFlow11.在交互环境中使用TensorFlow12.在容器中使用TensorFlow13.第三章内容概述14.TensorFlow模块与架构介绍15.Ten

Extjs5.0从入门到实战开发信息管理系统(Extjs基础、Extjs5新特性、Spring、Spring mvc、Mybatis)视频教程

Extjs5.0从入门到实战开发信息管理系统(Extjs基础.Extjs5新特性.Spring.Spring mvc.Mybatis)视频教程下载   联系QQ:1026270010 Extjs作为一款优秀的JS前端开发框架以其良好的架构.丰富的UI组件库.完善的文档和社区支持等诸多优点拥有广泛的市场应用空间,开发人员无需过多的关注HTML.CSS甚至各种常用JS算法,只需把精力放在业务逻辑上,利用各种组件的相互组合调用便可轻松而高效的开发出系统的前端页面. Extjs5在之前版本的基础上又推出

《Docker技术入门与实战》pdf

下载地址:网盘下载 内容简介  · · · · · · [编辑推荐] <Docker技术入门与实战>是中国首部docker著作,一线Docker先驱实战经验结晶,来自IBM和新浪等多位技术专家联袂推荐! <Docker技术入门与实战>结合企业生产环境,深入浅出地剖析 Docker 的核心概念.应用技巧.实现原理以及生态环境,为解决各类问题提供了有价值的参考. [内容简介] 在云计算时代,开发者将应用转移到云上已经解决了硬件管理的问题,然而软件配置和管理相关的问题依然存在.Docke

CMake快速入门教程-实战

http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/details/6314073 http://www.cnblogs.com/coderfenghc/archive/2013/01/20/2846621.html http://blog.sina.com.cn/s/blog_4aa4593d0100q3bt.html http://hahack.com/c

docker-9 supervisord 参考docker从入门到实战

参考docker从入门到实战 使用 Supervisor 来管理进程 Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具. 本小节将使用进程管理工具 supervisor 来管理容器中的多个进程.使用 Supervisor 可以更好的控制.管理.重启我们希望运行的进程.在这里我们演示

从入门到实战,Netty多线程篇案例集锦

从入门到实战,Netty多线程篇案例集锦 原创 2015-09-10 李林峰 InfoQ Netty案例集锦系列文章介绍 1|Netty的特点 Netty入门比较简单,主要原因有如下几点: Netty的API封装比较简单,将复杂的网络通信通过BootStrap等工具类做了二次封装,用户使用起来比较简单: Netty源码自带的Demo比较多,通过Demo可以很快入门: Netty社区资料.相关学习书籍也比较多,学习资料比较丰富. 但是很多入门之后的Netty学习者遇到了很多困惑,例如不知道在实际项