java判断对象已死_Java的JVM判断对象已死的基本算法分析

jvm中有各种的垃圾收集器,每个收集器都有各自的算法。但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础。

01两个基本算法

a、引用记数法:对象中加一个引用计数器,每次被引用计数器加一,引用失效减一,当减到0的时候就不会在被再引用了,就可以回收了。

优点:原理简单,效率高。

缺点:有很多例外情况要用大量额外的处理,比如两个对象相互引用。

b、可达性分析:通过一系列“GC Roots”的根对象为起始,根据引用关系向下搜索,搜索路径形成引用链,而那些没有在任何引用链上的叫做不可达对象,都是不可能被再次使用的。如下图,红色部分就是需要回收的。

bee41a19cf47518b7f541df0c55426b9.png

两种算法对比如下:

9a21cb9c20a2dd0fd889486ca8860f9d.png

02GC Roots包含哪些

可达性分析首先要确认的是GC Roots,只有选择合适的GC Roots才能真正的找到应该存在的对象和排除不应该存在的对象。GC Roots主要包含以下:

a、虚拟机栈中的对象,就是各个线程的方法里面的方法参数、局部变量、临时变量。

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

c、方法区中常量引用的对象,比如字符串常量池的引用。

d、本地方法栈引用的对。

e、虚拟机内部的引用,基本类型对应的class对象,常驻异常对象,系统类加载器。

f、所有被同步锁(synchronized)持有的对象。

g、Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存。

可以把上面的大概分成几个方面,如下图:

3ca029d7e6de47ec667d7abcc9a8316a.png

GC Roots实际上就是当前JVM必须要的对象,可以分成三类。

第一类是JVM线程里面直接引用的对象,相当于正在执行的方法里面的对象,这些肯定是必须存活的。

第二类是设置的一些静态常量,比如我们在类里面用static final修饰的一些对象,这类对象至jvm启动到结束都会一直存在。

第三类就是JVM本身所需要的对象,这类对象肯定不能被回收。

03Java的引用

可达性分析就是根据引用来判断的,那么Java中有哪些引用呢?一共分4类引用:

a、强引用:常见的引用赋值,垃圾收集器不回收。ObjectA a=new ObjectA();

b、软引用:还有用,但非必须。在系统将要发生内存溢出前,把他们列为回收范围进行二次回收,JDK1.2后SoftReference类实现。

c、弱引用:非必须,比软引用更弱。下次垃圾收集器无论内存是否足够,均回收。JDK1.2后WeakReference类实现。

d、虚引用:最弱引用关系,虚引用不影响对象的生存,也无法通过虚引用来取得对象实例。唯一作用是可以在垃圾收集器回收前收到一个系统通知。JDK1.2后PhantomReference类实现。

对比如下图:

eab450a54cef99e20bb41c1a3bc73905.png

后面三个引用我们平时使用几乎没有,多在一些源码中出现,依靠3个类实现:SoftReference、WeakReference、PhantomReference。在看到这三个类的时候能知道对应的含义。

04两次标记

当一个对象被标记为不可达对象的时候并不一定是马上被回收的。如果对象重写了finalize()方法,并且finalize()方法还没有被执行过(finalize()方法只会被执行一次),那么这个对象会被放入F-Queue队列里面。会有一个Finalizer线程去执行队列里面对象的finalize()。如果finalize()方法把这个对象重新赋值给了其他变量,就叫做逃脱成功。

垃圾收集器会对F-Queue队列里的对象进行第二次标记,如果在上一步中成功逃脱的就会移除即将回收的集合。

对于逃脱的对象,在下次被标记成不可达对象时,就会被直接回收,因为finalize()方法已经执行过一次了。

12b838282151f2239d47169009fb4c84.png

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

0213fb895a3819905b79f28f2601c322.png

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

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

相关文章

java开发 职业技能_java编程开发程序员需要具备哪些职业技能

随着互联网的不断发展,java编程开发可以说是目前学习人数和应用范围非常多的一种编程语言了,而今天我们就一起来了解一下,java编程开发程序员需要具备哪些职业技能。1、数据结构和算法分析数据结构和算法分析,对于一名程序员来说&…

Django model转字典的几种方法

平常的开发过程中不免遇到需要把model转成字典的需求,尤其是现在流行前后端分离架构,Json格式几乎成了前后端之间数据交换的标准,这种model转dict的需求就更多了,本文介绍几种日常使用的方法以供参考,所有例子均基于Dj…

微信小程序日历课表

最近项目中使用到了日历&#xff0c;在网上找了一些参考&#xff0c;自己改改,先看效果图 wxml <view class"date"><image class"direction" src"/images/icon/left.png" bindtapminusMouth/><label>{{year}}年{{mouth}}月<…

java并发数据共享机制_Java并发编程:核心理论之数据共享性

原标题&#xff1a;Java并发编程&#xff1a;核心理论之数据共享性并发编程是Java程序员最重要的技能之一&#xff0c;也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解&#xff0c;同时要求编程者逻辑清晰、思维缜密&#xff0c;这样才能写出高效、…

测试集准确率不变_这个医疗AI准确率突破天际,招来了铺天盖地的质疑

转自 | 量子位只要输入一次心跳的波谱。就能判断一个人有没有发生心力衰竭 (CHF) &#xff0c;准确率100%。这是英国华威大学领衔的团队&#xff0c;用机器学习方法做出的新成果。还登上了影响因子2.943的Biomedical Signal Processing and Control期刊。准确率眼看就要突破天际…

JavaFX自定义控件– Nest Thermostat第1部分

几周前&#xff0c;由于Hendrik Ebbers的出色文章 &#xff0c;我决定花一些时间观看有关JavaFX的JavaOne讨论。 我不得不说我已经学到了很多东西&#xff0c;只是看这些视频&#xff08;即使我还没有完成&#xff09;&#xff01; Gerrit的“使用力&#xff0c;路克”或使用J…

syslog可能引起得问题_牙齿经常有问题?可能是这4个坏习惯引起的,要改正

很多人明明很年轻&#xff0c;却得了很多牙齿疾病&#xff0c;甚至到了换牙的地步。牙齿虽然是最为坚硬的身体器官&#xff0c;但是即使再坚硬也是容易受到伤害的&#xff0c;日常生活中有很多小事都会造成对牙齿的伤害&#xff0c;想要保护牙齿&#xff0c;一定要改正一下这几…

jq实现前端文件上传

FormData FormData是XMLHttpRequest Level 2 新增的一个接口。 使用FormData可以实现各种文件上传。 使用 // 创建FormData的实例 var formdata new FormData();// 用append()为实例添加键和值 formdata.append(键名, 键值); 注意 使用jq的$.ajax()方法来进行文件上传时&am…

使用JUnitParams进行参数化的JUnit测试

参数化的单元测试用于在不同条件下测试相同的代码。 借助参数化的单元测试&#xff0c;我们可以建立一种测试方法&#xff0c;该方法从某些数据源中检索数据。 该数据源可以是测试数据对象&#xff0c;外部文件甚至数据库的集合。 一般的想法是使使用相同的单元测试方法测试不同…

js webpack 解决跨域问题_webpack-dev-server 作代理解决跨域,让你的本地开发飞起来...

最近在接到一个需求是做一个可视化的监控系统&#xff0c;mock数据来开发的话实在不太方便&#xff0c;况且数据量之大。查了一下资料&#xff0c;可以用webpack-dev-server作为代理&#xff0c;直接请求线上&#xff0c;哈哈哈&#xff0c;是不是很方便。### 目前我用的是webp…

实现用户操作指引功能

主要是通过定位找到需要指引的目标元素&#xff0c;然后再在蒙版上画一个div&#xff0c;设置为白色&#xff0c;定位到目标元素位置。思路大概就是这样。 图一&#xff1a; ![](https://img2018.cnblogs.com/blog/1354858/201811/1354858-20181105141942044-1763163359.png) 图…

vue2.0 element-ui中的el-select选择器无法显示选中的内容

我使用的是element-ui V2.2.3。代码如下&#xff0c;当我选择值得时候&#xff0c;el-select选择器无法显示选中的内容&#xff0c;但是能触发change方法&#xff0c;并且能输出选择的值。 select.vue文件 <template><div><div class"row" v-for&quo…

Gradle接口:Gradle构建元数据

正如我之前在“ 识别Gradle约定 ”和“ 从Ant Build演变Gradle构建&#xff1a;导入Ant构建文件 ”之类的文章中所显示的那样&#xff0c;可以通过Groovy访问Gradle的API来收集有关Gradle构建的重要信息。 在本文中&#xff0c;我演示了如何通过Gradle接口访问基本的Gradle构建…

php 工资 2018,佛山市2018年平均工资(社平工资)

2018年佛山市城镇非私营单位就业人员年平均工资为79824元(折合月平均工资6652)。2018年佛山市在岗职工年平均工资为80288元(折合月平均工资6691&#xff0c;四舍五入)。2018年佛山市城镇私营单位就业人员年平均工资为57297元(折合月平均工资4775)。广东地区2019年7月1日起市平均…

oj运行时错误如何查找原因_VLOOKUP又失灵?避免这四种错误类型

说起函数&#xff0c;你第一个想到什么&#xff1f;那绝对是表界曝光率最高的函数——VLOOKUP 了&#xff01;什么&#xff0c;你还不知道 VLOOKUP&#xff1f;那今天这篇文章&#xff0c;你可千万不能错过&#xff01;&#xff01;根据编号匹配姓名&#xff1b;根据评分匹配等…

Table Dragger - 简单的 JS 拖放排序表格插件

Table Dragger 是一个极简的实现拖放排序的表格插件&#xff0c;纯 JavaScript 库&#xff0c;不依赖 jQuery。用于构建操作方便的拖放排序功能&#xff0c;超级容易设置&#xff0c;有平滑的动画&#xff0c;支持触摸事件。 在线演示 免费下载 您可能感兴趣的相关文章网…

[Swift]遍历集合类型(数组、集合和字典)

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/ &#xff09;➤GitHub地址&…

沣东新城镐京遗址规划_沣东新城房价为啥这么高?

沣东房价为啥2万&#xff0c;为啥超越曲江浐灞&#xff0c;为啥和高新差不多&#xff1f;很多论坛 账号 抖音 喋喋不休&#xff0c;那么说说到底为啥这么贵1、从2018年开始&#xff0c;沣东新城商品房住宅用地&#xff0c;几乎容积率都在2.8以上&#xff0c;90%以上容积率在2.5…

在一台机器上运行多个ActiveMQ实例

几周前&#xff0c;我通过Mule ESB解决方案再次开始使用Apache ActiveMQ作为JMS提供程序。 由于我使用ActiveMQ已经有几年了&#xff0c;所以我认为最好检查一些&#xff08;新&#xff09;功能&#xff0c;例如故障转移传输和其他群集功能 。 为了能够测试这些最后的东西&…

P3138 [USACO16FEB]负载平衡Load Balancing_Silver

https://www.luogu.org/problemnew/show/P3138 题目描述 农民约翰的N只牛分别站在他的二维农场的不同位置&#xff08;x1,y1&#xff09;…(xn,yn)&#xff08;1<N<100000,xi和yi是正整奇数&#xff09;。他想建一排无限长度的南北方向的满足等式xa的围栏来把他的农场分成…