Java虚拟机:如何判定哪些对象可回收?

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习!

       在堆内存中存放着Java程序中几乎所有的对象实例,堆内存的容量是有限的,Java虚拟机会对堆内存进行管理,回收已经“死去”的对象(即不可能再被任何途径使用的对象),释放内存。垃圾收集器在对堆内存进行回收前,首先要做的第一件事就是确定这些对象中哪些还存活着,哪些已经死去。Java虚拟机是如何判断对象是否可以被回收的呢?

       引用计数算法

       引用计数算法的原理是这样的:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;在任何时刻计数器的值为0的对象就是不可能再被使用的,也就是可被回收的对象。

       引用计数算法的效率很高,但是主流的JVM并没有选用这种算法来判定可回收对象,因为它有一个致命的缺陷,那就是它无法解决对象之间相互循环引用的的问题,对于循环引用的对象它无法进行回收。

       假设有这样一段代码:

       

public class Object {public Object instance;public static void main(String[] args) {// 1Object objectA = new Object();Object objectB = new Object();// 2objectA.instance = objectB;objectB.instance = objectA;// 3objectA = null;objectB = null;}

       程序启动后,objectA和objectB两个对象被创建并在堆中分配内存,这两个对象都相互持有对方的引用,除此之外,这两个对象再无任何其他引用,实际上这两个对象已经不可能再被访问(引用被置空,无法访问),但是它们因为相互引用着对方,导致它们的引用计数器都不为0,于是引用计数算法无法通知GC收集器回收它们。

       实际上,当第1步执行时,两个对象的引用计数器值都为1;当第2步执行时,两个对象的引用计数器都为2;当第3步执行时,二者都清为空值,引用计数器值都变为1。根据引用计数算法的思想,值不为0的对象被认为是存活的,不会被回收;而事实上这两个对象已经不可能再被访问了,应该被回收。

       可达性分析算法

       在主流的JVM实现中,都是通过可达性分析算法来判定对象是否存活的。可达性分析算法的基本思想是:通过一系列被称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots对象没有任何引用链相连,就认为GC Roots到这个对象是不可达的,判定此对象为不可用对象,可以被回收。

       

       在上图中,objectA、objectB、objectC是可达的,不会被回收;objectD、objectE虽然有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。

       在Java中,可作为GC Roots的对象包括下面几种:

       1、虚拟机栈中引用的对象;

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

       3、方法区中常量引用的对象;

       4、本地方法栈中Native方法引用的对象。

       以上探讨了判定对象是否可回收的两种算法,判定对象是否可回收只是垃圾回收的第一步,接下来还要解决何时回收以及如何回收的问题,在后面的文章中我们来探讨这些问题。

 

转载于:https://www.cnblogs.com/fangfuhai/p/7197750.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html标签object和embed,html标签object和embed的区别

object和embed的区别The code in bold above is the actual code that you need to place in your page to embed a FusionCharts chart.In the above code, weveused and tags to embed the 3D Column Chart (Column3D.swf) within the HTML page.used &dataUrlData.xml u…

Apache Apollo REST API

Apache Apollo是新一代,高性能,多协议的消息传递代理,它是从头开始构建的,可以替代ActiveMQ5.x。 我过去曾在博客上发表过文章 (第一部分已经与第二部分一起发布了)。 Apollo的非阻塞异步体系结构使其速度…

bzoj1588 [HNOI2002]营业额统计

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17931 Solved: 7391[Submit][Status][Discuss]Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 T…

python管道通信_Python进程通信之匿名管道实例讲解

匿名管道管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么是输出端.os.pipe()返回2个文件描述符(r, w),表示可读的和可写的.示例代码如下:复制代码 代码如下:#!/usr/bin/pythonimport timeim…

css3中的box-sizing属性的使用

box-sizing属性用来定义元素的width和height所表示的区域,该属性一般有三种值:content-box、border-box、inherit。 其中inherit表示box-sizing的值应该从父元素继承。 content-box和border-box的主要区别就是元素的width和height的值包不包括border、padding这两…

ES6扩展运算符...进行的数组删除

今天写了按照React小书写了Reducer,发现基础真是太重要了,所有关于上层建筑的细节都需要回到下层细节中去寻找,而且现在的基础也由ES3变成了ES6了。 const ADD_USER "ADD_USER" const DELETE_USER "DELETE_USER" const…

中南大学在线考试答案计算机基础,中南大学《计算机基础》在线考试题库(267题)(有答案).doc...

中南大学《计算机基础》在线考试题库(267题)(有答案).doc 计算机基础01 总共89题共100分 一. 单选题 (共35题,共35分) 1. 域名服务器DNS的主要功能是( )。 (1分) A.通过请求及回答获取主机和网络相关的信息 B.查询主机的MAC地址 C.为主机自动命名 D.合理分配IP地址 ★标准答案&…

自动化的OSGi测试运行器

在我的团队成员中,我以忘记维护(JUnit)测试套件而闻名。 我只是无法为此付出额外的手动为套件添加测试的步骤。 幸运的是,有连续的集成服务器通过命名模式收集测试。 如果我介绍的一项孤立测试失败了,那么它会脱颖而出…

php post请求后端拿不到值_PHP Post获取不到非表单数据的问题解决办法

问题描述在使用vue-axios向后端post数据时,PHP端获取不到post的数据。问题解决修改php.ini配置找到php.ini配置文件,查找enable_post_data_reading变量,修改为打开状态,注释掉句前分好; Whether PHP will read the POST data.; Th…

CSS制作简单loading动画

曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出来。比如一个旋转的圆圈,并不都是将gif图放进去,有些就是画个静止图像,然后让它旋转就完了。gif图也可以&#xff…

机器学习:多变量线性回归

************************************** 注:本系列博客是博主学习Stanford大学 Andrew Ng 教授的《机器学习》课程笔记。博主深感学过课程后,不进行总结非常easy遗忘,依据课程加上自己对不明确问题的补充遂有此系列博客。本系列博客包含线性…

Java对象复活

总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理。 如果您复活该物体,会发生什么? 何时定稿? finalize方…

经过路由无法找到计算机,电脑无法启动服务提示系统找不到指定的路径(图)

原标题:"电脑无法启动服务提示系统找不到指定的路径"相关电脑问题教程分享。 - 来源:191路由网。众所周知,使用电脑的时候需要启动一些服务才能使用相关的功能,但是如果出现无法启动服务项,并且提示“错误3:…

有关域索引错误产生的原因及解决办法

1说明 数据库错误ORA-29861:域索引标记为LOADING/FAILED/UNUSABLE,其错误原因及解决办法,根据ORACLE官方文档的说法如下: // *Cause: An attempt has been made to access a domain index that is// being built or is marked faile…

详细解读css中的浮动以及清除浮动的方法

对于前端初学者来说,css浮动部分的知识是一块比较难以理解的部分,下面我将把我学习过程中的心得分享给大家。 导读: 1.css块级元素讲解 2.css中浮动是如何产生的 3.出现浮动后,如何清除浮动(本文将涉及到多种清除浮动…

微信多开txt_电脑版微信怎么双开、多开

新建一个txt文本文件,在文件中写入如下代码:echo offstart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exestart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exeexit保存文本文件。这里需要注意的是&#xff1a…

java 基础--随笔

---恢复内容开始--- java 对大小写敏感。 java没有任何无符号类型(unsigned)。 C/C是编译型语言,java是解释性语言。 JAVA编译过程同C/C 的 编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而…

多源计算机培训,多源数据汇聚的多流形学习算法研究

摘要:随着信息技术和互联网的飞速发展,人们可以从多个信息源获得数据,即多源数据.由于多源数据具有类型多样,尺度不统一等特点,对多源数据进行汇聚并提取有效信息是机器学习和模式识别等领域研究的热点.由于多流形学习能够有效地揭示复杂数据中的内在结构,因此本文主…

Ubuntu 16.04 安装mysql5.7

技术更新换代,数据库也不断更新,需要不断努力学习,下面就是如何在 ubuntu中安装 mysql。 废话不多说,上来就是干 一、安装mysql 5.7 sudo apt-get update sudo apt-get install mysql-server 中间会提示您输出root 密码&#xff…

CSS多列布局(实例)

前言 一列布局二列布局三列布局 1 一列布局 一列布局&#xff1a; HTML部分 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>一列布局</title> </head> <body> <div class"head">…