工作原理:为每个内存对象维护一个引用计数。

当有新的引用指向某对象时就将该对象的引用计数加一,当指向该对象的引用被销毁时将该计数减一,当计数归零时,就回收该对象所占用的内存资源。

缺陷:在每次内存对象被引用或引用被销毁的时候都必须修改引用计数,这类操作被称为footprint。引用计数的footprint是很高的。这使得程序整体的性能受到比较大的影响。因此多数现代的程序语言都不适用引用计数作为垃圾收集的实现算法。

另外,引用计数还有一个致命的缺陷,当程中出现序循环引用时,引用计数算法无法检测出来,被循环引用的内存对象就成了无法回收的内存。从而引起内存泄露。

举例说明就是:

class A{public B b;}
class B{public A a;
}
public class Main{public static void main(String[] args){A a = new A();B b = new B();a.b=b;b.a=a;}
}

在函数的结尾,a和b的计数均为2

先撤销a,然后a的计数为1,在等待b.a对a的引用的撤销,也就是在等待b的撤销

对于b来讲,也是同理

两个对象都在等待对方撤销,所有这两个资源均不能释放

  • 标记-清除(Mark-Sweep)
    此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
  • 复制(Copying)
    此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现"碎片"问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。
  • 标记-整理(Mark-Compact)
    此算法结合了"标记-清除"和"复制"两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象"压缩"到堆的其中一块,按顺序排放。此算法避免了"标记-清除"的碎片问题,同时也避免了"复制"算法的空间问题。
  • 增量收集(Incremental Collecting)
    实施垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。
  • 分代(Generational Collecting)
    基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

java垃圾回收之循环引用相关推荐

  1. [转]java垃圾回收之循环引用

    工作原理:为每个内存对象维护一个引用计数. 当有新的引用指向某对象时就将该对象的引用计数加一,当指向该对象的引用被销毁时将该计数减一,当计数归零时,就回收该对象所占用的内存资源. 缺陷:在每次内存对象 ...

  2. 假期三天,我肝了万字的Java垃圾回收,看完你还敢说不会?

    大家好,我是狂聊,上一篇已经把 Jvm 的运行区数据和类加载机制聊完了. 今天来说说 Java 垃圾回收,高频面试问题. 提纲附上,话不多说,直接干货 1.什么是垃圾回收? 垃圾回收(Garbage ...

  3. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  4. Java垃圾回收工作原理

    在C++中,在heap上分配对象比在stack上分配对象更加昂贵.程序需要找到合适的内存块,再返回内存的地址.但是在Java中垃圾回收器显著地提高了在heap上分配对象的速度.听起来会有些怪,但是这就 ...

  5. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  6. java垃圾回收机制串行_Java垃圾回收机制

    Java语言是一门自动内存管理的语言,不再需要的对象可以通过垃圾回收自动进行内存释放. Java运行时内存区域划分 JVM将Java程序运行时内存区域划分成以下几个部分: 程序计数器(Program ...

  7. java垃圾回收机制_JVM的垃圾回收机制——垃圾回收算法

    一.Java垃圾回收机制 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行.在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者 ...

  8. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例

    53.垃圾回收算法的实现原理 53.1.目录 53.2.启动Java垃圾回收 53.3.Java垃圾回收过程 53.4.垃圾回收中实例的终结 53.5.对象什么时候符合垃圾回收的条件? 53.5.1. ...

  9. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

最新文章

  1. sql server 游标的使用
  2. python PyQt5 QSplitter类(可拉伸区域分隔器)
  3. python functools import wraps_python装饰器中functools.wraps的作用详解
  4. flask sql外键使用_如何在SQL中使用外键?
  5. 合并两个链表数据结构c语言,合并两个链表.
  6. SVG 教程 (二)矩形
  7. 最小二乘法拟合多项式原理以及c++实现
  8. java day56【 Mybatis 延迟加载策略 、 Mybatis 缓存、Mybatis 注解开发 】
  9. 给大楼装上转动外壳减少风力作用
  10. 常见几个排序源码及二分查找源码
  11. 超级爆笑:2008高考各省零分作文大全
  12. echarts 多条折线时数量由多到少更新数据时残留问题
  13. 面试官:说一说 Docker 原理
  14. SAP CDS UI 常用注解用法
  15. 蓝湖类似的软件_发现一款即使不联网也可以和蓝湖一样好用的工具。PxCook(像素大厨)...
  16. HTTP协议Response
  17. 利用Ancol PCA法将祖源计算器结果与实际情况相结合可视化分析
  18. debian 11 安装bind9服务
  19. java个性签名_程序员用搞笑个性签名
  20. NOIP提高组1820~1830集合答案

热门文章

  1. 一、使用两台Centos7系统搭建Hadoop-3.1.4完全分布式集群
  2. 九、Spark模块和安装
  3. EM算法和GMM(中)
  4. 关于投稿 LaTeX 的使用
  5. TIP 2019开源论文:基于深度学习的HEVC多帧环路滤波方法
  6. 岗位推荐 | 腾讯AI Lab招聘计算机视觉方向实习生
  7. 2017年度最值得读的AI论文评选 | 大张旗鼓送福利
  8. 揭秘阿里小蜜:基于检索模型和生成模型相结合的聊天引擎 | PaperDaily #25
  9. 数字图像处理与Python实现笔记之频域滤波
  10. python美化输出模块_Python 格式化输出 ( 颜色 )