引用计数法和根搜索算法

Qt多线程操作sqlite数据库 通过锁解决了sqlite数据库多线程操作的写冲突和读写冲突,锁是有消耗的,但很小,我实测6-19ms,这个消耗算是可以了。多线程操作sqlite数据库,关键之处就是在于加锁,保存同时只有一个写的操作;读的操作是可以并发的;有写的操作,读的操作也必须等待,可以说,同时只有一个写操作,无其它操作,通过锁就达到了这一个目的。如果一个线程正在写,另一个线程也要写,怎么办,锁就会让另一个线程等待前一个线程写完,自己再写。锁的本质意义就是保证了,锁的区域,只有一个写线程在访问,而读的线程,可以并发。 阅读详情

引用计数法和根搜索算法

如何判断对象是否存活

引用计数法

概念

引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。

首先需要声明,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存。 
什么是引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1.任何时刻计数器值为0的对象就是不可能再被使用的。那为什么主流的Java虚拟机里面都没有选用这种算法呢?其中最主要的原因是它很难解决对象之间相互循环引用的问题。

 

 

根搜索算法

概念

根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。

那么问题又来了,如何选取GCRoots对象呢?在Java语言中,可以作为GCRoots的对象包括下面几种:

(1). 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。

(2). 方法区中的类静态属性引用的对象。

(3). 方法区中常量引用的对象。

(4). 本地方法栈中JNI(Native方法)引用的对象。

下面给出一个GCRoots的例子,如下图,为GCRoots的引用链。

 

看下面的图:

根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

从上图,reference1、reference2、reference3都是GC Roots,可以看出: 
reference1-> 对象实例1; 
reference2-> 对象实例2; 
reference3-> 对象实例4; 
reference3-> 对象实例4 -> 对象实例6; 
可以得出对象实例1、2、4、6都具有GC Roots可达性,也就是存活对象,不能被GC回收的对象。 
而对于对象实例3、5直接虽然连通,但并没有任何一个GC Roots与之相连,这便是GC Roots不可达的对象,这就是GC需要回收的垃圾对象。

 

引用计数法 已经被淘汰了~~ 因为循环依赖问题

A a = new A()    每个对象有个年龄 大于了一定年龄(15) 存放老年代 否则 新生代

GC线程不定时进行回收,如果对象被应用的话,年龄就+1,如果没有被继续回收则-1

如果年龄为0的话,被回收

循环依赖问题:

 A a = new A()  

 B b = new B() 

a.x=b

b.x=a

a=null

b=null

很难判断 然后 怎么去标记为0  去回收

 

根搜索算法  GCRoots 没有和GCRoots  需要和根节点有依赖关系 如果没有和GCRoots有任何引用关系情况,GC认为不可达对象。 

 遍历一遍看看 与GCRoots有引用没

只有 user3和user5 不可达 

 

多线程写文件操作 最近项目有个需求,对数据库中的号码进行检查,检查号码状态是否正常,检查方法需要依赖接口,每个号码调一次http接口, 基本思路: 1,轮询分页查询数据库,取号码 2,对取出的号码循环调接口查询 3,接口结果记录到文件中 由于最初没有考虑大量号码的情况,使用的是单线程处理,当时2W号码用了4个小时,简直跑废了的感觉,可能接口返回比较慢接近1s 后边就使用了多线程处理,网上查了下,基本都是 阅读详情

相关推荐

小米手机Magisk解锁与Root完整指南:从Bootloader到模块管理

Android系统Root权限获取是设备深度定制的核心技术之一,其核心原理在于通过修改系统启动流程获取超级用户权限。Systemless Root技术通过动态挂载修改,在不触碰系统分区的前提下实现功能注入,既保证了系统完整性,又能绕过完整性检测。这一技术为设备带来了极高的可定制性,用户可以通过模块化方式增强系统功能、修改UI界面或启用隐藏特性。在小米手机生态中,由于官方提供了完整的Bootloader解锁通道,结合Magisk的无系统修改Root方案,使得安全可控的深度定制成为可能。本文聚焦于Bootloa

weixin_29164185的博客 334

根搜索算法

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

jfkidear的专栏 8517

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析

本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。

weixin_28224217的博客 406

根搜索算法(JVM垃圾回收对象判定标准)

又叫可达性算法。在主流的商用程序语言中(Java和C#),都是使用根搜索算法判定对象是否存活 的。基本思路就是通过一系列的名为“GCRoot”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GCRoot没有任何引用链相连(就 是从GCRoot到这个对象不可达)时,则证明此对象是不可用的。不可达不一定会被回收, 可以用finalize()方法抢救下, 但不推荐。这些对象被认为是程序中仍然活跃的对象,因此它们不会被垃圾回收器回收。

m0_62226781的博客 774

用Python实现古诗词填字游戏(三)

古诗词做填字游戏的第三部分代码,也是最核心的部分。实现对诗文和关键字的选定,并确定文字的输出位置。

PosPro的专栏 6117

WSL2 Ubuntu复现FoundationPose项目(docker)

复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2

woaidawangwang的博客 2000

一分钟带你了解:根搜索算法

原理 通过一系列名为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径被称为引用链(Refreance Chain),当一个对象没有任何引用链相连,则证明此对象不可用。如下图所示,object6、object7、object8虽然相互关联但是他们到GC Roots是不可达的,所以将他们判定为不可回收的对象 在java语言中可作为GC Roots的对象包括以下四种: 1、虚拟栈中(栈帧中的本地变量表)引用的对象 2、方法区中的类静态属性引用的对象 3、方法区中常量引用的对象 4、本

玉兰花秀丽 898

Python自动化办公:5分钟搞定钉钉群文件自动发送(附完整代码)

本文详细介绍了如何利用Python实现钉钉群文件的自动化发送。通过结合钉钉企业内部应用与群机器人API,构建了包含智能令牌管理、文件上传与消息发送的完整工作流。文章提供了可直接复用的完整代码,并分享了定时任务、目录监听等进阶实战方案,帮助职场人士高效解决重复性文件发送难题,实现办公自动化。

7z8x2c4v6b9的博客 325

垃圾回收算法(2)-根搜索算法

前言 相对于引用计数算法而言,根搜索算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效的解决在引用记数法中一些已经死亡的对象因为相互引用而导致的无法正确被 标记的问题,防止内存泄漏的发生。 算法原理 根搜索算法是以根对象集合为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达(使用根算法后,内存中的存活对象都会被根对象集合直接或间接连接着) 如果目标对象不可达,就意味着该对象已经死亡,便可将其标记为垃圾对象。 在根搜索算法中不可达的对象,也并非是“非死不可”,这时候他们暂时处

少年闰土的博客 617

Autosar Configuration(十四)SomeIP之配置SoAd

本文主要介绍SomeIp协议栈中的SoAd在Configurator中的详细配置

king110108的专栏 2600

YOLOv11改进策略【SPPF】| 将特征金字塔池化修改为:SPPCSPC,提升模型的特征提取能力和计算效率。

本文记录的是。YOLOv7中的SPPCSPC(Spatial Pyramid Pooling Cross Stage Partial Connections)模块是一种结合了(SPP)和(CSP)的改进结构,本文将其添加到YOLOv11中,

Limiiiing的博客 1821

JVM-GC-根搜索算法(可达性分析、追踪性垃圾收集)

缺点:根搜索算法在分析内存是否可回收时,需要保证在一致性的快照中进行。否则,无法保证分析结构准确性。优点: 实现简单、执行高效,可有效的解决 循环引用 问题。

ipcaf的博客 410

IEC61850规约客户端软件开发实战(第六章)

IEC 61850标准中的GOOSE(Generic Object Oriented Substation Event,面向通用对象的变电站事件)功能是变电站自动化系统的核心通信机制,主要用于实现智能电子设备(IED)间高可靠性、低延时的实时信号传输。本章简述其核心功能与技术特点。

半青年的博客 1779

【操作系统】多线程的同步与互斥

整理总结操作系统多线程同步与互斥的相关理论知识,包括同步与互斥的概念,同步互斥的原子实现与使用,以及经典同步问题哲学家就餐问题与读者-写者问题。

weixin_46216674的博客 1422

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

操作系统实验进程的同步与互斥读者写者问题:探索多线程同步机制

操作系统实验进程的同步与互斥读者写者问题:探索多线程同步机制 去发现同类优质开源项目:https://gitcode.com/ 在计算机科学中,操作系统实验是理解理论概念的重要途径。本文将为您详细介绍一个名为“操作系统实验——进程的同步与互斥(读者写者问题)”的开源项目,该项目通过模拟生产者消费者模型,实现了对多线程同步与互斥机制的实际应用。 项目介绍 操作系统实验——进程的同步与互斥(读者写者问...

gitblog_06742的博客 656

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java多线程之间实现同步

一、课程目标 理解线程安全? synchronized用法 死锁 二、什么是线程安全? 2.1 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: class ThreadTrain1 impl...

kai46385076的专栏 1077

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

GC常见算法

1、GC的概念 GC:Garbage Collection 垃圾收集 1960年 Lisp使用了GC Java中,GC的对象是Java堆和方法区(即永久区) 我们接下来对上面的三句话进行一一的解释: (1)GC:Garbage Collection 垃圾收集。这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM。 在C/C++里是由程序猿自己去申请、管理和释放内存空间,因此没有GC的概念。而在Java中,后台专门有一个专门用于垃圾回

可小辉的博客 1390

java 根搜索_深入理解Java虚拟机(2) - 根搜索算法

这个系列文章是对《深入理解Java虚拟机》一书的笔记及个人理解垃圾收集(Garbage Collection,GC)需要完成三件事件1、哪些内存需要回收?2、什么时候回收?3、如何回收?Java虚拟机要进行GC,首先要确定哪些内存需要回收,但是GC时,Java程序依然是在运行当中,所以,如果将程序需要的对象回收了,就会造成程序出错。那么,怎么在Java堆中的众多对象中找出哪些是可以被回收的,哪些是...

weixin_35669769的博客 167

可达性分析算法(根搜索算法GCRoots)

转自:https://www.jianshu.com/p/b79fe594eed3 根搜索算法 概念 根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 这个算法的基本思想是通过一系列称为“GC Roots...

u012501054的博客 5130

第15课:GC时候的引用计数算法和根搜索算法

内容:     1.GC时候的引用计数     2.GC的时候根搜索算法 一、GC时候的引用计数     对象一旦被使用,计数器会进行+1操作,当对象取消引用计数器-1操作,当为0时被标示为垃圾。此种标示方法的弊端在于已经死亡的对象如果存在相互引用,则会一直占用内存空间,不被回收。此时会导致内存泄漏。为了解决这个问题出现了根搜索算法。 二、GC的时候根搜索算法     1.Java采用该...

someby的博客 550

java gc 根搜索算法_简析JVM GC的根搜索算法

根搜索算法的基本思路是通过一系列的“GC Roots”的对象作为起始点,从这些节点开始往下搜索,搜索的走过的路径称为引用链,当一个对象到“GC Roots”没有引用链可达时(也就是用图论的话说就是从GC Roots到这个对象不可达),则证明此对象是不可用的,这样的对象被判定为是可回收的。java中可以作为GC Roots对象包括以下几种:1.虚拟机栈(栈帧中的本地变量表)中的引用对象。2.方法区中...

weixin_39586683的博客 373

JVM垃圾回收根搜索的三种算法

关于垃圾回收,总遇到总记不住,做下总结,加深印象,有不对不完整的欢迎大家批评指正 JDK1.2之后,垃圾回收采用跟搜索算法,有三种算法:1、标记清除算法  2、复制算法  3、标记整理算法 1、标记清除算法 从根集合进行扫描,对存活的对象进行标记,标记完后,再重新扫描整个空间,对未标记的对象进行回收 优点:存活对象多的时候,比较高效 缺点:因为是直接回收,容易造成内存碎片 2、复制算法

xiaoyu_bug的博客 1088

java gc 根搜索算法_Java内存管理及GC算法

概述内存划分虚拟机规范中将内存分为六大部分,分别为PC寄存器、JAVA虚拟机栈、JAVA堆、方法区、运行时常量及本地方法栈。1.PC寄存器:线程独占;2.JAVA虚拟机栈:线程独有;JAVA虚拟机栈是在创建线程的同时创建的,用于存储栈帧,JAVA虚拟机栈也是线程独有的。3.JAVA堆:全局共享;4.方法区:全局共享;它主要存储的是运行时常量池字段信息方法信息构造方法普通函数的字节码内容以及一些特殊...

weixin_39717026的博客 222

【JVM】Java 垃圾回收基础与根搜索算法详解

垃圾回收的主要目的是回收不再被引用的对象所占的内存。由于 Java 采用的是自动内存管理,开发者不需要手动释放内存,垃圾回收器会在合适的时间自动完成这项工作。Java 的垃圾回收机制依赖于堆内存的管理,负责清理那些不再使用的对象,从而保证系统内存不会被耗尽。根搜索算法(GC Root Tracing)是 Java 垃圾回收的重要算法之一,它通过从GC Roots开始,逐步追踪对象的引用关系,判断哪些对象是可达的,哪些是不可达的。可达的对象被认为是“活跃”的,不会被回收;

m0_38053034的博客 1109

Java虚拟机规范gcroots,jvm垃圾回收-可达性分析算法之GC Roots理解

《深入理解JVM》原文:在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。这个算法的基本思路就是通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,下图对象object5, object6, object7虽然...

weixin_30768979的博客 295

GC Roots 是什么?哪些对象可以作为 GC Root?看完秒懂!

通过调用本地的库文件的内部方法,使 JAVA 可以实现和本地机器的紧密联系,调用系统级的各接口方法,还是不明白?并不是,对象的 finalize 方法给了对象一次垂死挣扎的机会,当对象不可达(可回收)时,当发生GC时,会先判断对象是否执行了 finalize 方法,如果未执行,则会先执行 finalize 方法,我们可以在此方法里将当前对象与 GC Roots 关联,这样执行 finalize 方法之后,GC 会再次判断对象是否可达,如果不可达,则会被回收,如果可达,则不回收!3、方法区中常量引用的对象。

Knight 888
上一篇: 新生代与老年代
下一篇: 垃圾收集算法
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值