jvm 判断对象是否已经死亡

JVM的GC如何判断对象是否死亡? 因为热爱,所以坚持 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。 一、前言   我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半个多世纪的发展,Java已经进入了“自动化”时代,让使用者只需要注重业务逻辑的开发而不需要担心内存的使用情况。那么我们为什么还要学习Java的垃圾回收机制呢?原因很简单:我们不想止于“增删改查工程师”这样的初级水平,一旦程序发生了内存溢出、内存泄漏等问题时,我们可以用已掌握的知识更好的调节和优化我们的代码。在学这章节之前 立即下载

如何判断java对象已经死亡?

容易想到的就是引用计数算法,就说的是给对象添加一个引用计数器,每当有一个地方引用到他,就加1;引用失效就减1。但是这样做是有问题的。
看下例子:

public class ReferenceCountingGC {
    public Object instace = null;
//  一个200M的对象
    private byte[] bigSize = new byte[200*1024*1024];

    public static void main(String[] args) {
//      引用加1
        ReferenceCountingGC a = new ReferenceCountingGC();
        ReferenceCountingGC b = new ReferenceCountingGC();
//      引用再加1
        a.instace=b;
        b.instace=a;
//      如果是引用计数,那么a,b的引用为2
//      在这里a,b减1
        a = null;
        b = null;
//      那么在这里ab引用都不是0,应该不可以回收
        System.gc();
        sleep(30);
    }
    public static void sleep(int second){
        try {
            Thread.sleep(second*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

debug,通过VisualVM发现,内存仍然被回收了。
这里写图片描述
,所以JVM不是通过引用计数的方式来确定是否回收对象的。因为,引用计数从上面的例子看出来会有一个问题就是,虽然还有引用,但这两个对象都是不可达对象(无法被访问的)。
所以java的垃圾回收不是采用这种简陋的引用计数来实现的。

可达性分析算法

java是通过可达性分析(Reachability Analysis)算法来判断对象是否存活。
其基本思想是通过一系列“”GC Roots“”的对象为起始点,从这些节点向下搜索,搜索所走过的路称为引用链,当一个对象没有任何引用链相连时,则证明该对象是不可引用的。如图(o1,o2,o3为不可达对象):
这里写图片描述

GC Root对象

1.虚拟机栈中引用的对象。
2.方法区中类静态属性引用的对象。
3.方法区常量引用的对象。
4.本地方法栈中JNI引用的对象。

引用分类

强引用(StrongReference),软引用(SoftReference),弱引用(WeakReference)以及PhantomReference(虚引用)
1.如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
2.软引用他的特点是当内存足够时不会回收这种引用类型的对象,只有当内存不够用时才会回收。
3.弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用最常见的用处是在集合类中,尤其在哈希表中。哈希表的接口允许使用任何Java对象作为键来使用。当一个键值对被放入到哈希表中之后,哈希表对象本身就有了对这些键和值对象的引用。
4.虚引用的特点是只要GC一运行就会把他给回收了,但会得到一个系统通知。

不可达对象就一定死亡吗?

其实不可达对象也并非是‘’非死不可‘’,但是他们已经处于缓刑状态。
要真的宣布一个对象死亡要经过两次标记过程:第一次标记并且筛选,筛选的条件是是否有必要执行了finalize方法。如果该类重写了该方法,并且没有执行过,那么该方法将会被执行。如果该方法执行完成,对象又重新和GCRoot关联上(把自己的引用给GCRoot),那么他在下一次GC时就不会被回收。
具体来看一个例子。

public class FinalEscapeGC {
    public static FinalEscapeGC obj = null;
    public void isAlive(){
        System.out.println("yes I'm still alive");
    }
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize method executed!");
        FinalEscapeGC.obj = this;
    }
    /**
     * finalize method executed!
        yes I'm still alive
        no I'm dead!
     */
    public static void main(String[] args) throws InterruptedException {
        obj = new FinalEscapeGC();
//      第一次GC自救成功
        obj = null;
        System.gc();
//      finalize方法优先级很低,因此要等他执行,不行还没执行就被回收了
        Thread.sleep(500);
        if(obj == null)
            System.out.println("no I'm dead!");
        else
            obj.isAlive();

//      第二次自救失败
        obj = null;
        System.gc();
        Thread.sleep(500);
        if(obj == null)
            System.out.println("no I'm dead!");
        else
            obj.isAlive();
    }

}

这个例子说明两点:
1,finalize方法是对象最后一个活下去的机会;
2,机会只能使用一次。
警告:finalize方法知道就行,千万别用,可以使用finally代替
总结:
完整的从JVM垃圾回收的角度分析了对象是否死亡,对象是否该回收等知识点。要点:使用可达性分析算法发现对象是否可回收,GCRoot引用有哪些。引用的分级,finalize方法啥时候调用。

无人机视角下基于YOLOv5/v8/v10的车辆检测系统:从算法原理到UI界面实战 随着无人机技术的普及和智慧城市的发展,无人机视角下的车辆检测在交通监控、战场侦察、灾害救援等领域展现出巨大的应用价值。然而,无人机航拍图像存在目标尺度小、视角多变、背景复杂等挑战。本文深入探讨了如何利用YOLOv5、YOLOv8、YOLOv10三个代表性目标检测算法,构建一套完整的无人机车辆检测系统。文章不仅详细解析了各版本YOLO的核心技术演进,还提供了从数据集准备、模型训练、性能评估到基于PyQt5/PySide6的图形界面开发的完整代码实现。通过本文,读者将能够掌握构建无人机实时车辆检测系统的全流程技 阅读详情

相关推荐

第一天(点亮led灯+led灯闪烁)——Arduino uno R3 学习之旅

发光二极管(Light Emitting Diode,简称LED)是一种能够将电能转化为光能的固态的半导体器件。长脚为阳极短脚为阴极电流必须从长脚流入从短脚流出方可点亮LED##杜邦线杜邦线:是导线中的一种,杜邦线端部有两种接头形式:带针的一种称为公头,带孔的一种称为母头,如下图所示:说明:与电源相连接时,一般采用红色杜邦线,与地连接时采用黑色杜邦线。

qwsbcjendb的博客 1130

(新手必看)HashMap是什么?

那么HashMap什么时候进行扩容呢?当hashmap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过16*0.75=12的时候,就把数组的大小扩展为2*16=32

xyk:的博客 1万+

opencv实践项目-图片拼接之缝合线算法

opencv 图片缝合线算法

wyw0000的博客 2624

HashMap详解

一、HashMap集合简介 HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。 jdk1.8 之前 HashMap 由 数组 + 链表 组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存

java123456111的博客 5万+

智能客服系统知识库构建:长尾问题解决方案全解析

智能客服系统知识库构建:长尾问题解决方案全解析

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 4112

openstack卷分离异常问题处理

对于 2023-05-10 之后的所有 OpenStack 版本,需要将Nova 配置为向 Cinder 发送服务令牌,然后 Cinder 接收该令牌。cinder.conf处添加service_token_role配置。1.修改nova的config文件添加如下配置。确定service role 是否存在。有关详细信息,请参阅。重启nova cinder 服务。nova-compute日志。cinder-api日志。

weixin_43391291的博客 477

HashMap详解 Java [ 基础 ] ✅

HashMap是Java中一个强大且高效的集合类,用于快速查找和存储键值对。理解其工作原理和常用操作对于提高编程效率和解决复杂问题非常有帮助。

lenyan~的博客 2万+

OrangePi Kunpeng Pro 安装 ROS2 + Gazebo

OrangePi Kunpeng Pro 的优点很明显,内置openEuler,配备PD电源,做到开箱即用;板子设计也不错,风扇噪音不大,散热良好,昇腾芯片又确保小板子的性能,接口丰富是这类板子共同的优点,也很好的继承了下来,甚至还可以外接固态,可靠性大大提升。使用起来,哪怕不用openEuler的话,也可以很方便的刷Ubuntu来实现一些需要依赖的开发工作,这次没有跑AI模型,所以对算力的优势还没有很明显的感受,下次可以试一下yolo跑跑看。

Arcan 1822

HashMap在jdk1.7和jdk1.8中的区别

一、初窥HashMap HashMap是应用更广泛的哈希表实现,而且大部分情况下,都能在常数时间性能的情况下进行put和get操作。 jdk1.7中底层是由数组(也有叫做“位桶”的)+链表实现;jdk1.8中底层是由数组+链表/红黑树实现 可以存储null键和null值,线程不安全。在HashMap中,null可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该key,也可以表示该key所对应的value为null。因

qq_34325438的博客 2601

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.6 在kernel 中实现系统复位和系统关机驱动

上一章节`Qemu`篇我们已经实现了我们`SOC`的`power reset`和 `power down` 寄存器,本章节我们就在`Linux driver`中去实现它

DSMGUOGUO的博客 542

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 243

jvm如何判断对象是否死亡?

一、对垃圾收集的思考 垃圾收集并不是Java语言的伴生产物,实际上,垃圾收集的历史远远比Java久远,在1960年诞生于麻省理工的Lisp是第一门开始使用内存动态分配和垃圾收集技术的语言。当Lisp还是胚胎时期时,其作者John McCarthy就思考过垃圾收集需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收 虽然今天的内存动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,但当需要排查各种内存溢出、内存泄露问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须

初栀的博客 357

图解电动汽车:电动汽车主要参数

动力性指标 汽车的动力性指标主要有最高车速、加速时间、最大爬坡等,体现了汽车在行驶过程中能达到的极限运动水平。对于电动汽车,其动力性由搭载的驱动电动机决定,主要的参数包括最大扭矩、额定功率、最大功率、最大转速等。 功率是指物体在单位时间内所做的功的多少,是描述做功快慢的物理量,单位是 kW。 扭矩是指机械元件转动的力矩,也称转矩,表示转动力量的大小,单位是 N·m。 转速是指发动机/电动机的转速,的单位是 rpm,即转每分钟。额定转速是指在额定功率下电动机的转速,最大转速则是在最大功率下电动机的转速。

程序员「阿基米东」的编程之旅 2万+

「 JVM 」Java虚拟机是如何判断对象是否死亡的?

我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半个多世纪的发展,Java已经进入了“自动化”时代,让使用者只需要注重业务逻辑的开发而不需要担心内存的使用情况。那么我们为什么还要学习Java的垃圾回收机制呢?原因很简单:我们不想止于“增删改查工程师”这样的初级水平,一旦程序发生了内存溢出、内存泄漏等问题时,我们可以用已掌握的知识更好的调节和优化我们的代码。方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。试想一下,GC(垃圾回收机制)在清理内存的时候第一件事要做什么。

frozenpenguin的博客 1373

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JVM-判断对象是否死亡

总:对堆垃圾回收前的要判断哪些对象已经死亡(即不能再被任 何途径使用的对象)。两种方法:引用计数法和可达性分析算法。 一.引用计数法:给对象中添加一个引用计数器,引用一次,加1;引用失效,计数器减1;计数器为0的对象是不可能再被使用的。 注意:不被主流虚拟机使用,因为要考虑很多情况。比如两个没用的对象相互循环引用,A引用B,B引用A。 二.可达性分析算法:通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点向下搜索, 节点所走过的路径称为引用链,当一个对象到 GC Roots

weixin_43227536的博客 229

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

判断JVM对象是否死亡

引用计数法 存在循环引用问题。 Redis是通过循环引用判断对象是否死亡的。 可达性分析 从GC Roots向下不可达时,证明此对象是不可能再使用的。 GC Roots的对象: JVM栈中的对象。 本地方法栈(native方法)中的对象。 方法区中静态引用的对象,如static final修饰的对象。 方法区中常量引用的对象,如字符串常量池里的引用。 被同步锁(synchronized)持有的对象。 … 引用类型 传统的“引用”定义:如果reference类型的数据中存储的数值代表的是另外一块内存的起始

weixin_48096939的博客 192

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jvm判断对象是否死亡

方法有两种:引用计数法和可达性分析算法 引用计数法       在对象中添加一个引用计数器,每有一个地方引用它,引用计时器就加一。当引用计数器为0,即没有引用指向该对象的时候,就表示对象死亡。目前主流的虚拟机均没有采用这个算法来管理内存,因为它不能解决对象循环引用的问题,比如说:对象A和B相互引用着对方,但是再没有其它引用指向它们。所以它们的引用计数器值一直为1。垃圾回收器就无法回收它们。 可达性分析算法         算法的思

weixin_43312993的博客 178

JVM中如何判断对象是否死亡

有两种方法: 1.引用计数器算法: 给对象添加一个引用计数器,每当有一个地方引用它时,引用计数器加一,当引用失效时,计数器值减一;任何时刻对象的引用计数器为0的对象就是不可能再被使用的; 2.可达性算法分析: GC Roots 不可达的对象即为不可能再被引用的对象,即使这个对象可能还与其他对象有联系 两种算法区别: 怎么说呢,引用计数器算法针对相互引用的对象是不会发现的,,也就是他们的

jane_fast的博客 1723

判断是否存在此对象_JVM的垃圾回收机制,判断对象是否死亡

这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。一、前言我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半个多世纪的发展,Java已经进入了“自动化”时代,让使用者只需要注重业务逻辑的开发而不需要担心内存的使用情况。那么我们为什么还要学习Java的垃圾回收机制呢?原因很简单:我们不想止于“增删改查工程...

weixin_33180221的博客 109

JVM(java)如何判断对象是否死亡?

虚拟机回收对象之前首先要判断对象是否死亡,两种方法:引用计数器法和可达性分析算法。 引用计数器法:给对象添加一个引用计数器,每当有一个地方引用它,计数器就加1,当引用失效时,计数器就减1,任何时刻当计数器为0的时候,这个对象就不能再被使用了。优点:实现简单效率高。缺点:主流jvm不使用这个算法,因为无法解决对象循环引用的问题。 可达性分析算法:首先有一系列的“GC roots”根节点,从根节点向下搜索,走过的路径叫做引用链,当一个对象到GC root没有任何引用链的时候,证明对象是不可活的(就是这个对象

qq_38197844的博客 782

深入理解JVM--如何判断对象是否死亡

深入理解JVM--如何判断对象是否死亡概述引用计数法可达性分析算法 概述 堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不能再被任何途径使用的对象) 引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使用的。 这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法...

wuzhenwei0419的博客 305

jvm学习笔记:第3章java判断对象是否死亡

3.2.2 根搜索算法 在主流的商用程序语言中(Java和C#,甚至包括前面提到的古老的Lisp),都是使用根搜索算法(GC Roots Tracing)判定对象是否存活的。这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话

宇宙神帝 1856

jvm垃圾回收机制_JVM的垃圾回收机制,判断对象是否死亡

这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。一、前言我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半个多世纪的发展,Java已经进入了“自动化”时代,让使用者只需要注重业务逻辑的开发而不需要担心内存的使用情况。那么我们为什么还要学习Java的垃圾回收机制呢?原因很简单:我们不想止于“增删改查工程...

weixin_39684898的博客 95

为什么jvm不使用引用计数算法来判断对象是否已经死亡

在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着 ,哪些已经“死去”(即不可能再被任何途径使用的对象)。 引用计数算法 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有—个地方引用它时,计数器值就加1 ; 当引用失效时,计数器值就减1 ; 任何时刻计数器为0的对象就是不可能再被使用的。 客观地说,引用计数算法( Reference Counting ) 的实现简单,判定效率也很高,在大部分情况下它都是一个

zty 842

【深入理解jvm读书笔记】如何判断一个java对象是否已经死亡

当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是通过可达性分析(Reachability Analysis)算法来判定对象是否存活的。缺点:占用了一些额外的内存空间,这个看似简单的算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确地工作,譬如单纯的引用计数就很难解决对象之间相互循环引用的问题。根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象“临时性”地加入,共同构成完整GC Roots集合。,搜索过程所走过的路径称为。

Ez4Sterben的博客 195
上一篇: 使用netty+zookeeper+protobuf实现一个RPC过程
下一篇: java常用位操作
Next__One
博客等级 码龄9年 14粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值