【原创】GC/垃圾回收简介

GC简介

1 GC机制

1.1 对象

从计算机的角度,装有数据的内存空间

1.2 作用

将内存垃圾的释放自动化

1.3 本质

将已经引用不到的对象视为死亡,将死亡的对象找出来并且作为垃圾进行回收

2 GC算法

2.1 跟踪回收

2.1.1 原理

从根开始扫描判断对象的生死

2.1.2 标记清除

(1)过程

  1. 第一次扫描:以变量或运行栈作为根,从根开始将可能被引用的对象进行标记,将没被标记的对象进行垃圾回收
  2. 第二次扫描:将全部对象进行扫描,对没有被标记的对象进行垃圾回收,扫描的同时还需要将存活的对象的标记去除

(2)缺点

  1. 处理时间与对象数量相关,在大量对象且极少存活的情况下,效率不明显
  2. 由复制收集解决这一问题

2.1.3 复制收集

(1)过程

  1. 扫描一遍:将根对象复制到新开辟的内存空间,再用复制的对象所能引用的对象进行递归复制
  2. 清除旧空间

(2)优缺点

  1. 扫描一遍就相当于标记清除的标记阶段,清除阶段开销极小
  2. cache局部性,复制收集按照引用将关联的对象复制到新空间,在内存空间里距离较近,效率会提高
  3. 在存活对象大比列存在的情况下,复制对象的开销会加大

2.2 引用计数

2.2.1 原理

当对象引用发生变化时,利用引用计数更新对象的状态,判断对象的生死

2.2.2 引用计数

(1)过程

  在对象内部保持一个对该对象的引用计数,当引用发生增减时进行更新

(2)优缺点

  1. 能够做到立即释放垃圾,中断时间短
  2. 无法释放循环引用的对象
  3. 在并行环境下,需要对计数操作进行加锁互斥,开销较大

2.3 跟踪回收和引用计数的结合

2.3.1 分代回收

(1)原理

  大部分对象在短时间里会成为垃圾,而经过一定时间仍然存活下来的往往拥有较长的寿命,所以增加新生的对象的扫描,减少老生对象的扫描

(2)过程

  1. GC小回收:利用复制收集,将新空间标记为老生代或利用标记清除方式将存活对象标记为老生代,清除死亡对象
  2. GC大回收(偶尔进行):以全部区域为对象进行GC操作

(3)记录集

  1. 在对象引用发生改变时,如果老生代对象引用到了新生代对象,则将引用记录加入到记录集
  2. 需要时刻保持更新,新生代被老生代引用的瞬间就必须更新

(4)写屏障

  需要将添加到记录集的操作嵌入到对象修改的地方,对所有涉及修改对象的地方进行保护

(5)优缺点

  1. 减少了需要扫描的对象,缩短GC时间
  2. 算法受到程序行为,分代数量,大回收的触发条件的影响

2.3.2 增量回收

(1)原理

  1. 将GC操作分为多个阶段进行
  2. 与分代回收相似,需要增加写屏障,防止存活的对象被清除,而该清除的对象没被清除

(2)优缺点

  中断时间取决于对象的数量,在牺牲总GC时间的情况下,缩短中断时间

2.3.3 并行回收

(1)原理

  1. 程序运行和GC同时进行
  2. 需要写屏障对状态进行实时更新

(2)特点

  1. 在GC的某个阶段还是需要暂停程序的运行,无法完全与程序并行
  2. 未来趋势

2.4 GC大一统理论

  所有的GC算法都是跟踪回收和引用计数的结合,两者相互独立,对其中一方进行改善的技术之中必然存在对另一方的改善技术,而其结果只是两种的结合

3 思维导图

本文链接:http://www.cnblogs.com/cposture/p/4845189.html

时间: 2024-08-04 05:42:54

【原创】GC/垃圾回收简介的相关文章

Java GC系列(1):Java垃圾回收简介

本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序. 下面四篇教程是了解Java 垃圾回收(GC)的基础: 垃圾回收简介 圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 这篇教程是系列第一部分.首先会解释基本的术语,比如JDK.JVM.JRE和HotSpotVM.接着会介

数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>

C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override重写 无论什么情况,都是执行新的方法(成员) 继承是实现多态的一个前提,没有继承多态是不能实现的 父类与子类实现多态 抽象类与子类实现 抽象类不能实例化 抽象类中的抽象方法没有方法体 抽象类的成员有哪些   ->包含非抽象成员   ->不能实例化   ->子类必须实现父类的 抽象方法,除非子

GC 垃圾回收

一.托管 .Net所指的托管资源到底是什么意思呢?是相对于所有资源,还是只限于某一方面的资源?很多人对此不是很了解. 其实.Net所指的托管只是针对内存这一个方面,并不是对于所有的元素:因此对于Stream,数据库的连接GDI+的相关对象,还有Com对象等等,这些资源并不是受到.Net管理而统称为非托管资源.而对于内存的释放和回收,系统提供了GC(Garbage Collector),而至于其他资源则需要手动进行释放. 二.垃圾 什么是垃圾..Net类型分为两大类,一个就是值类型,另一个就是引用

面试官,不要再问我“Java GC垃圾回收机制”了

Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解>中有些内容我们没有讲,本篇结合垃圾回收机制来一起学习.还记得JVM中堆的结构图吗? 图中展示了堆中三个区域:Eden.From Survivor.To Survivor.从图中可以也可以看到它们的大小比例,准确来说是:8:1:1.为什么要这样设计呢,本篇文章后续会给出解答,还是根据垃圾回收的具体情况来设计的.

计时器 GC垃圾回收 demo

计时器: 1 public void start() { 2 //定义计时器 3 Timer timer=new Timer(); 4 //定义运行间隔(数字越小,速度越快) 5 int interval=30; 6 //创建定时任务 7 TimerTask task=new TimerTask() { 8 public void run() { 9 moveAction(); //调用的其他方法 10 enemyEnterAction(); 11 repaint(); 12 } 13 }; 1

Java GC - 垃圾回收机制

1.简介 对于Java developer来说,了解JVM GC工作原理能够帮助我们开发出更优秀的应用,同时在处理JVM瓶颈时能够更加自由.在最近一年的应用开发中能体会到这些知识带来的好处,并且让我们的应用在较大规模的并发时能够良好的工作. 本文部分知识和图片来源于书籍<Java Performance> - Charlie Hunt & Binu John 著,该书全面讲解了Java 应用的性能分析.优化点与JVM原理等知识,本文(以及稍候的一些文章)只包含 GC collector

JVM调优系列:(四)GC垃圾回收

跟踪收集算法: 复制(copying): 将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A.因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,不需要标记骤,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存. 标记清除(mark-sweep): 收集器先从根开始访问所有对象,标记活跃对象.然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理

An Introduction to Garbage Collection(垃圾回收简介)

1. Introduction 2. Principles 3. Advantages 4. Disadvantages 5. 常见的垃圾回收技术 5.1. 跟踪式垃圾回收 5.1.1. 基本算法 5.2. 引用计数垃圾回收 5.3. 分代垃圾回收 5.4. 对象使用类型分析 6. 参考 团队项目中用Go的地方越来越多,最近打算在业余时间好好看看Golang的虚拟机实现.像Java/C#/Python一样,Go的优势之一就是将开发人员从繁重的内存管理中解放 出来,本文对编程语言中常见的垃圾回收技

Java GC 垃圾回收算法 内存分配

垃圾回收(Garbage Collection, GC)是Java不同于c与c++的重要特性之一. 他帮助Java自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机会. 利用垃圾回收,程序员可以避免一些指针和内存泄露相关的bug(这一类bug通常很隐蔽). 垃圾回收实际上是将原本属于程序员的责任转移给计算机. GC需要完成的3件事情: 哪些内存需要回收 什么时候回收 如何回收 1 回收那些对象? 在Java中采用可达性分析算法来判定对象是否存活,是否可以被回收