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. JDK、JRE、JVM三者间的关系

    JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库.Java Runtime Enviro ...

  2. SAP第一轮面试总结

    1. 开始是一套面试题,可以选JAVA或C/C++两个语言的英文题.基础语法题,以指针为主. 2. 英文介绍,自由发挥.问了以下几个问题: 离职的愿意,未来五年的计划,介不介意使用ABAP langu ...

  3. Ext JS

    官網:http://www.sencha.com/products/extjs/

  4. which type of VS files should be committed into a version control system

    which type of VS files should be committed into a version control system? aps, no: last resource edi ...

  5. [WPF]Slider控件常用方法

    WPF的Slider控件继承自RangeBase类型,同继承自RangeBase的控件还有ProgressBar和ScrollBar,这类控件都是在一定数值范围内表示一个值的用途. 首先注意而Rang ...

  6. 关于maven中央仓库jar包不存在问题

    最近接手一个maven项目,引入依赖的时候报了一个 Missing artifact com.oracle:ojdbc6:jar:12.1.0.1 pom.xml 的错误,网上一查,原来是Oracle ...

  7. 使用.NET读取exchange邮件

    公司有个第3方的系统,不能操作源码修改错误捕获,但是错误会发一个邮件出来,里面包含了主要的信息.于是想从邮件下手,提取需要的数据 开始考虑使用的是exchange service,主要参考http:/ ...

  8. CSS clear清除浮动

    1.CSS中的clear有四个参数: none:允许两边都可以浮动. left:不允许左边有浮动. right:不允许右边有浮动. both(默认):不允许有浮动. 2.一开始在CSS中clear浮动 ...

  9. Class 'Illuminate\Html\HtmlServiceProvider' not found或者form表单不能正常使用解决办法

    在laravel框架中,form不能正常使用如何处理. 网上搜到的解决方案通常都是一致的,下面分类考虑: 1,打开根目录composer.json 文件, require 里面增加: 如果larave ...

  10. jsQunit

    1:什么是单元测试? 1.1:单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.单元测试主要是用来检验程式的内部逻辑,也称为个体测试.结构测试或逻辑驱动测试.通常 ...