引用计数法的原理和优缺点
垃圾标记阶段:对象存活判断
- 堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中那些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象,GC才会在垃圾回收过程时,释放掉其所占用的内存空间,因此我们可以称这个过程为垃圾标记阶段。
- 那么在JVM中是如何标记一个对象死亡的呢?简单来说,当一个对象已经不再被任何存活的对象引用时,就可以宣判为死亡。
- 判断对象存活一般有两种方式:引用计数算法和可达性分析算法。
引用计数法
- 引用计数法(Reference Counting)比较简单,对每一个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。
- 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象的引用计数器的值为0,即表示对象A不能在被使用,可进行回收。
优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。
缺点:(1)他需要单独的字段存储计数器,这样的做法增加了存储空间的开销。
(2)每次赋值都需要更新计数器,伴随着加法和减法操作,这增加了时间开销。
(3)引用计数器还有一个严重的问题,即无法处理循环引用的问题,这是一条致命的缺陷,导致在Java回收的垃圾回收器中没有使用这类算法。
不可达的对象,引用计数器不为零,依然无法被回收。导致内存泄露。
Python的引用计数算法和实施方案
引用计数算法,是很多语言的资源回收选择,例如因人工智能而大火的Python,它是同时支持引用计数和垃圾回收机制的。
具体哪种最优是要看场景的,业界有大规模实践中仅保留引用计数机制,以提高吞吐量的尝试。
Java并没有选择引用计数是因为其存在一个基本的难题,也就是很难处理循环引用关系。
Python是如何解决循环引用的?
手动解除:很好理解,就是在合适的时机,解除引用关系。
使用弱引用weakref,weakref是Python提供的标准库,旨在解决循环引用问题。
引用计数法的原理和优缺点相关推荐
- Jvm(20),如何定义为垃圾对象----引用计数法
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...
- 【垃圾回收器】基于Go实现引用计数法(ReferenceCount)
不想传火的,可以点击下面的链接! github:GCByGO 给我点赞嘛,球球了! What This? 现象 引用计数法是一种垃圾回收算法,用于跟踪对象被引用的次数.在该算法中,每个对象都会维护一个 ...
- GC算法-引用计数法
概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建对 ...
- JVM中引用计数法与可达性分析
目录 概要 如何判断对象已死? 引用计数算法 优点 缺点 举例说明 可达性分析 图例说明 GC Roots的对象包括以下几种 可达性分析回收过程 四大引用 回收方法区 方法区的垃圾收集主要回收两部分内 ...
- 氨氮吹脱法脱与php有关系吗,污水处理技术之氨氮吹脱法的原理、优缺点及影响因素...
北极星环保网讯:高氨氮废水的处理中,吹脱法占有很重要的地位,本文详细介绍吹脱法的原理,优缺点及影响吹脱的因素! 一.吹脱原理 吹脱法的基本原理是气液相平衡和传质速度理论.废水中的NH3-N通常以铵离子 ...
- python引用计数实例_Python中的引用计数法
[toc] 引用计数法 增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执行的. #define Py_INCREF(op) (((PyOb ...
- 垃圾回收-- 引用计数法
引用计数法 引用计数法,最重要的就是计数器,记录有多少引用该对象 引用计数法与mutator 的执行密切相关,在mutator 的处理过程中通过增减计数器的值来进行内存管理, 在分配和更新对象时会发生 ...
- Python学习:引用计数法
1.增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执行的. #define Py_INCREF(op) (((PyObject*)(op) ...
- 如何判断对象是否存活之引用计数发
垃圾回收机制是怎么判断一个对象是否存活的,为什么要讲这个呢,这个讲完你就明白,新生代是怎么做晋升的,他的存活有几个方向点,垃圾回收对象是怎么判断存活的,哪几种,首先第一种引用计数法,根搜索法,GC r ...
最新文章
- PyTorch中的循环神经网络RNN函数及词嵌入函数介绍
- 利用CodeIgniter中的Email类发邮件
- python实战系列之写个好玩的猜拳游戏(附源代码)
- SSIM与PSNR的计算方式
- 中级程序员教程-Cache映像技术
- 根文件系统构建(Buildroot 方式)
- IBM “第8格(Debug)”开发者技术沙龙首站招募中,有胆你就来!
- Hash Collision DoS 攻击
- 【问题解决】解决eclipse不识别Android手机的问题
- HCIE Secuirty 防火墙IPS功能和NIP 备考笔记(幕布)
- layui 自定义排序_layui使用心得
- 基于Docker搭建Gitlab
- linux dump 分析工具,使用 Crash 工具分析 Linux dump 文件
- 菊安酱的机器学习实战
- python怎么实现分数形式_python实现将将输入的可约分数化简为不可约分数
- 奔驰4-MATIC和奥迪quattro的区别和共同点是什么(杂记)
- Android自定义九宫格图案解锁
- 一张表看懂英式音标和美式音标的差异
- RandomAccess接口的使用
- 飞腾服务器如何查看cpu型号,飞腾CPU服务器云平台管理
热门文章
- 基于ROS节点多机协同(无人机/无人车)分析
- 【转贴】如何读好Phd博士
- 打开Windows任务管理器的七种方法
- kettle web 版本 (webspoon) 中文部署 kettle 页面编辑 kettleweb 中文
- android 动态修改dns,如何修改android手机上网DNS
- Liferay DXP数字体验平台,荣耀绽放:端对端的客户体验
- 笔记本电脑都有光驱吗?
- 微信是与服务器长连接,java与微信小程序实现websocket长连接.pdf
- RHEL5配置Samba服务器实现文件共享
- Windows7系统速度慢 或是颜色校正惹祸