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开发中的常见危险信号》一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题。 这些“红色标记”类似于“代码气味”的概念,我在这篇文章中引用的某些特定“红色标记”被称为“代码气味”。 正如我在…

python平均分由高到低顺序排列输出选手编号和最后得分_python 字典的使用案例二:求平均分,并按平均分由高到低输出选手编号和最后得分...

校园好声音大赛,三位选手得分,由8位评委给出。请根据评分表,将每们选手的得分去掉一个最高分和一个最低分后求平均分,并按照平均分由高到低输出选手编号和最后得分。dicScores {012: [90, 94, 97, 86, 85, 89, 88, 85], 005: [91…

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类ResourceBundle和MessageFormat提供了一个很好的工具集&#xff0c;用于解决Java应用程序内部的本地化消息。 这篇文章提供了一个小示例&#xff0c;说明如何使用ChoiceFormat将与消息相关的简单条件从Java代码移动到消息文件中。 如果您已经知道ChoiceFormat我认为您不会…

【LuoguP3241】[HNOI2015] 开店

题目链接 题意 给出一棵边带权的树&#xff0c;多次在线询问一个点到一个区间内的点的距离和。 Sol 分块过不了的 一个 trick &#xff0c;都知道要算两点之间距离可以拆成到根的距离和他们的 LCA 到根的距离 &#xff0c;其实要算多个点到一个点距离也可以使用一个类似的 tric…

windows中的项目拷贝到linux中,部分数据不显示的原因

linux严格区分大小写&#xff0c;可能是数据表名大小写导致的。 如上传文件不成功&#xff0c;可能是系统权限导致的。转载于:https://www.cnblogs.com/miaoxingren/p/9784743.html

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

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

调用天气预报接口

方案一&#xff1a; 浏览器由于安全的限制&#xff0c;不允许跨域访问。但是PHP服务器是允许的。我们可以通过使用PHP文件做代理&#xff0c;通过PHP来调用接口。 详细接口分析可参看&#xff1a;http://www.cnblogs.com/wangjingblogs/p/3192953.html 返回JSON格式 PHP代码…

测试集准确率不变_这个医疗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…

PHP涉及的所有英文单词

PHP涉及的所有英文单词拦路虎 PHP再火&#xff0c;也会让一部同学心生畏惧&#xff0c;因为看到编辑器中那一串串英文单词&#xff0c;担心自己英文不好&#xff0c;从而对能学会PHP的决心产生动摇。其实大可不必&#xff0c;英文在学习PHP过程中真的连级别都够不上&#xff0c…

java 不编译咋办_java – 为什么JVM不编译整个程序,而不是逐个编译?

他所说的是,在运行时将所有字节码编译成机器语言是不切实际的.您可以预先编译所有内容,但这并不是JIT所采用的方法.一方面,不知道程序有多大.人们在30分钟的启动时会相当不高兴,因为它编译了可以找到的每个库(给定的Java程序不在一个文件中,它可以访问类路径中的所有内容)对于另…

mysql .pdb是什么文件_计算广告算法到底要做什么?

这个话题在这个专栏开篇就该去讲。恰逢今天公司业务和财务培训(20190216)之后&#xff0c;也有一些思索&#xff0c;索性就都汇总写下来。本文杂述&#xff0c;不尽完备&#xff0c;但是值得不断完善。我喜欢一句话“革命不是请客吃饭&#xff0c;不是做文章&#xff0c;不是绘…

浅析inline-block--使用inline-block创建布局

inline-block前端程序猿们肯定不陌生&#xff0c;它是display属性的一个取值。 之所以称之为inline-block。是因为它兼具行内元素(inline-element)和块级元素(block-element)的特征。 块级元素&#xff08;block elements&#xff09;,来源于CSS盒子模型。块级元素包含width h…

Cookie和Session版的登录验证

URL : from django.conf.urls import url from app01 import viewsurlpatterns [url(r^login/, views.login),url(r^home/, views.home),url(r^index/, views.index), ] 前端 : <form action"" method"post">{% csrf_token %}<input type"t…

Java 8 Friday Goodies:java.io终于成功了!

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

ASP.NET获取客户端、服务器端基础信息

1. 在ASP.NET中专用属性&#xff1a;获取服务器电脑名&#xff1a;Page.Server.ManchineName获取用户信息&#xff1a;Page.User获取客户端电脑名&#xff1a;Page.Request.UserHostName获取客户端电脑IP&#xff1a;Page.Request.UserHostAddress2. 在网络编程中的通用方法&am…

java json decode 中文_关于json_decode乱码及NULL的解决方法

写接口的同学应该会经常遇到数据格式的转换&#xff0c;这时候必不可少的两个函数就是json_encode()和json_decode()。这两个函数使用的时候有很多的主要事项&#xff0c;在这里我来说一下json_decode()。json_decode():对JSON 格式的字符串进行解码,接受一个JSON 格式的字符串…