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

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

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

    本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Ja ...

  2. JVM虚拟机 与 GC 垃圾回收

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JVM体系结构概述 1.JVM 与系统.硬件 ​ JVM是运行在操作系统之上的,它与硬件没有直接的交 ...

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

    C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override ...

  4. GC垃圾回收算法

    什么是GC垃圾回收呢.日常生活中我们去餐厅吃饭吃完饭,吃完饭走了餐具不用管,服务员在把餐具拿走,这是一种方式,服务员怎么知道他要来把餐具拿走呢,因为你走了,这个位置空了.服务员什么时候拿走餐具很重要, ...

  5. GC垃圾回收

    我们在开发需求的时候,可能很少关注到垃圾回收,因为我们绝大多数的时候都是使用的托管资源,托管资源的内存回收.net已经帮我们做了,但是.net的内存回收不是实时的,所以我们还是要关注下.net的垃圾回 ...

  6. JVM学习02:GC垃圾回收和内存分配

    JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...

  7. JVM和GC垃圾回收机制和内存分配

    JVM运行期间 线程共享 线程私有 线程共享: 方法区 堆方法区:存放可以共享数据,静态常量,类的共有方法属性字段等,可以共享的存在方法区. 堆:存放class对象 . 线程私有:本地方法栈 虚拟机栈 ...

  8. RPC调用与GC垃圾回收

    RPC调用 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件.账户余额不足等).系统故障(如网络或系统超时或中断.数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处 ...

  9. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...

随机推荐

  1. NDB Cluster 存储引擎物理备份

    NDB Cluster 存储引擎物理备份NDB Cluster 存储引擎也是一款事务性存储引擎,和Innodb 一样也有redo 日志.NDBCluter 存储引擎自己提供了备份功能,可以通过相关的命 ...

  2. 一个CURL

    CURL curl是利用url语法规则来传输文件,数据的工具,主要实现和服务器中网页,资源传输的工具.这里有一个关于感冒还没好的段子. 1.去phpini开启curl扩展,重启阿帕奇或者配置环境变量或 ...

  3. 关于C#怎么固定窗口大小属性详解

    原文地址:http://zhidao.baidu.com/link?url=aDqlJMuABC8IxXz5drmZcPIHHlTKX2mrfIpyRZNFp0IAB6RSxT24B2XXMRCK1e ...

  4. C# Form.Close 的释放问题

    今天使用From窗口Close后,发现From的资源还存在,并没有释放资源,只有在程序关闭的时候才去释放. Form1:button按钮 private void button1_Click(obje ...

  5. NetSuite API - SuiteScript API.js

    /* from: http://blog.csdn.net/levin_rain/article/details/8571444 */ ' Core SuiteScript Functions ' f ...

  6. SQL Split

    最初是根据数据ID批量删除数据,因为不知道到底是要删除多少条,而T-sql里也没有像C#中params这样方便的东西,所以想到字符串分割,但是发现T-sql中也没有提供字符串分割的函数,所以自己搜索了 ...

  7. MVC路由配置

    目录 URL Routing 的定义方式 示例准备 给片段变量定义默认值 定义静态片段 自定义片段变量 自定义片段变量的定义和取值 将自定义片段变量作为Action方法的参数 指定自定义片段变量为可选 ...

  8. C# 加密

    一.RSA加密解密 using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...

  9. 使用dom4j创建和解析xml文件

    使用dom4j创建和解析xml文件 在项目开发中,我们经常会遇到xml文件的创建和解析从别人接口得到的xml文件,而我们最常使用的组件是dom4j. 下面我就以代码来讲解一下如何使用dom4j来创建x ...

  10. 详解在Visual Studio中使用git版本系统[转]

    这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指正. 一 .安装 git 开发工具 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了 ...