垃圾标记阶段:对象存活判断

  • 堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中那些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象,GC才会在垃圾回收过程时,释放掉其所占用的内存空间,因此我们可以称这个过程为垃圾标记阶段。
  • 那么在JVM中是如何标记一个对象死亡的呢?简单来说,当一个对象已经不再被任何存活的对象引用时,就可以宣判为死亡。
  • 判断对象存活一般有两种方式:引用计数算法和可达性分析算法。

引用计数法

  • 引用计数法(Reference Counting)比较简单,对每一个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。
  • 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象的引用计数器的值为0,即表示对象A不能在被使用,可进行回收。

优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。

缺点:(1)他需要单独的字段存储计数器,这样的做法增加了存储空间的开销。

(2)每次赋值都需要更新计数器,伴随着加法和减法操作,这增加了时间开销。

(3)引用计数器还有一个严重的问题,即无法处理循环引用的问题,这是一条致命的缺陷,导致在Java回收的垃圾回收器中没有使用这类算法。

不可达的对象,引用计数器不为零,依然无法被回收。导致内存泄露。

Python的引用计数算法和实施方案

  • 引用计数算法,是很多语言的资源回收选择,例如因人工智能而大火的Python,它是同时支持引用计数和垃圾回收机制的。

  • 具体哪种最优是要看场景的,业界有大规模实践中仅保留引用计数机制,以提高吞吐量的尝试。

  • Java并没有选择引用计数是因为其存在一个基本的难题,也就是很难处理循环引用关系。

  • Python是如何解决循环引用的?

手动解除:很好理解,就是在合适的时机,解除引用关系。

使用弱引用weakref,weakref是Python提供的标准库,旨在解决循环引用问题。

引用计数法的原理和优缺点相关推荐

  1. Jvm(20),如何定义为垃圾对象----引用计数法

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  2. 【垃圾回收器】基于Go实现引用计数法(ReferenceCount)

    不想传火的,可以点击下面的链接! github:GCByGO 给我点赞嘛,球球了! What This? 现象 引用计数法是一种垃圾回收算法,用于跟踪对象被引用的次数.在该算法中,每个对象都会维护一个 ...

  3. GC算法-引用计数法

    概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建对 ...

  4. JVM中引用计数法与可达性分析

    目录 概要 如何判断对象已死? 引用计数算法 优点 缺点 举例说明 可达性分析 图例说明 GC Roots的对象包括以下几种 可达性分析回收过程 四大引用 回收方法区 方法区的垃圾收集主要回收两部分内 ...

  5. 氨氮吹脱法脱与php有关系吗,污水处理技术之氨氮吹脱法的原理、优缺点及影响因素...

    北极星环保网讯:高氨氮废水的处理中,吹脱法占有很重要的地位,本文详细介绍吹脱法的原理,优缺点及影响吹脱的因素! 一.吹脱原理 吹脱法的基本原理是气液相平衡和传质速度理论.废水中的NH3-N通常以铵离子 ...

  6. python引用计数实例_Python中的引用计数法

    [toc] 引用计数法 增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执行的. #define Py_INCREF(op) (((PyOb ...

  7. 垃圾回收-- 引用计数法

    引用计数法 引用计数法,最重要的就是计数器,记录有多少引用该对象 引用计数法与mutator 的执行密切相关,在mutator 的处理过程中通过增减计数器的值来进行内存管理, 在分配和更新对象时会发生 ...

  8. Python学习:引用计数法

    1.增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执行的. #define Py_INCREF(op) (((PyObject*)(op) ...

  9. 如何判断对象是否存活之引用计数发

    垃圾回收机制是怎么判断一个对象是否存活的,为什么要讲这个呢,这个讲完你就明白,新生代是怎么做晋升的,他的存活有几个方向点,垃圾回收对象是怎么判断存活的,哪几种,首先第一种引用计数法,根搜索法,GC r ...

最新文章

  1. PyTorch中的循环神经网络RNN函数及词嵌入函数介绍
  2. 利用CodeIgniter中的Email类发邮件
  3. python实战系列之写个好玩的猜拳游戏(附源代码)
  4. SSIM与PSNR的计算方式
  5. 中级程序员教程-Cache映像技术
  6. 根文件系统构建(Buildroot 方式)
  7. IBM “第8格(Debug)”开发者技术沙龙首站招募中,有胆你就来!
  8. Hash Collision DoS 攻击
  9. 【问题解决】解决eclipse不识别Android手机的问题
  10. HCIE Secuirty 防火墙IPS功能和NIP 备考笔记(幕布)
  11. layui 自定义排序_layui使用心得
  12. 基于Docker搭建Gitlab
  13. linux dump 分析工具,使用 Crash 工具分析 Linux dump 文件
  14. 菊安酱的机器学习实战
  15. python怎么实现分数形式_python实现将将输入的可约分数化简为不可约分数
  16. 奔驰4-MATIC和奥迪quattro的区别和共同点是什么(杂记)
  17. Android自定义九宫格图案解锁
  18. 一张表看懂英式音标和美式音标的差异
  19. RandomAccess接口的使用
  20. 飞腾服务器如何查看cpu型号,飞腾CPU服务器云平台管理

热门文章

  1. 基于ROS节点多机协同(无人机/无人车)分析
  2. 【转贴】如何读好Phd博士
  3. 打开Windows任务管理器的七种方法
  4. kettle web 版本 (webspoon) 中文部署 kettle 页面编辑 kettleweb 中文
  5. android 动态修改dns,如何修改android手机上网DNS
  6. Liferay DXP数字体验平台,荣耀绽放:端对端的客户体验
  7. 笔记本电脑都有光驱吗?
  8. 微信是与服务器长连接,java与微信小程序实现websocket长连接.pdf
  9. RHEL5配置Samba服务器实现文件共享
  10. Windows7系统速度慢 或是颜色校正惹祸