[转]GC简介

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

原文写得太好了,这里转一下。

1 GC机制

1.1 对象

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

1.2 作用

将内存垃圾的释放自动化

1.3 本质

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

2 GC算法

2.1 跟踪回收

2.1.1 原理

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

2.1.2 标记清除

)过程

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

)缺点

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

2.1.3 复制收集

)过程

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

)优缺点

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

2.2 引用计数

2.2.1 原理

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

2.2.2 引用计数

)过程

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

)优缺点

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

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

2.3.1 分代回收

)原理

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

)过程

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

)记录集

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

)写屏障

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

)优缺点

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

2.3.2 增量回收

)原理

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

)优缺点

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

2.3.3 并行回收

)原理

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

)特点

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

2.4 GC大一统理论

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

3 思维导图

总结

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

[转]GC简介的更多相关文章

  1. jvm-垃圾回收gc简介+jvm内存模型简介

    gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...

  2. JVM内存管理------GC简介

    为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让 ...

  3. JVM内存管理之GC简介

    为何要了解GC策略与原理?        原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题 ...

  4. JVM的GC简介和实例

    本文是一次内部分享中总结了jvm gc的分类和一些实例, 内容是introduction级别的,供初学人士参考.成文仓促,难免有些错误,如果有大牛发现,请留言,我一定及时更正,谢谢!JVM内存布局主要 ...

  5. JVM内存管理(一)--GC简介

    GC策略解决了哪些问题?  既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪些问题呢,粗略的来说,主要有以下几点.         1.哪些对象可以被回收.         2.何时回收 ...

  6. jvm堆内存和GC简介

    最近经常遇到jvm内存问题,觉得还是有必要整理下jvm内存的相关逻辑,这里只描述jvm堆内存,对外内存暂不阐述. jvm内存简图 jvm内存分为堆内存和非堆内存,堆内存分为年轻代.老年代,非堆内存里只 ...

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

    GC简介 1 GC机制 1.1 对象 从计算机的角度,装有数据的内存空间 1.2 作用 将内存垃圾的释放自动化 1.3 本质 将已经引用不到的对象视为死亡,将死亡的对象找出来并且作为垃圾进行回收 2 ...

  8. Java内存管理及GC算法

    概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚 ...

  9. [面试] Java GC (未整理完)

    Java GC简介 什么是 GC ? Java程序不用像C++程序在程序中自行处理内存的回收释放.这是因为Java在JVM虚拟机上增加了垃圾回收(GC)机制,用以在合适的时间触发垃圾回收. 你都了解哪 ...

随机推荐

  1. Memo

    1.Webpack: node_modules/css/index.js didn't return a function   npm install css-loader style-loader ...

  2. 更换项目jdk版本

    现在开发用的都是1.7版本,但是以前老的服务器上可能是1.6jdk,这时候就需要我们将项目重新用1.6编译; 修改三个文件(三个地方)即可; 第一步,右键单击项目,选择properties,修改1:J ...

  3. [leetcode]题型整理之用bit统计个数

    137. Single Number II Given an array of integers, every element appears three times except for one. ...

  4. [原创]Centos7 从零编译配置Memcached

    序言 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. Memca ...

  5. Qt中暂停线程的执行

    在线程中定义一个信号量 QMutex pause; 把run()函数中循环执行的部分用信号量pause锁住: void run() { while(1) { pause.lock(); //循环执行的 ...

  6. .NET程序运行过程产生的问题

    1.数据兼容性 功能模块的开发,会影响历史数据以及新数据的更新和体现.比如开发功能007,007支持了金额可变,数量不可变的原理.而历史数据均是数量可变,金额不可变的原理.此时,就会产生了问题. 2. ...

  7. 2016 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair dfs序+分块

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  8. [转]Windows7文件夹转移清理臃肿的C盘

    当你使用Windows的时候,你会发现无论哪个版本的Windows,系统都会默认将用户文件夹和程序数据文件夹(xp下是Documents and Settings文件夹,而windows7和vista ...

  9. C#开发笔记

    Dictionary 检查后获取值:Dictionary.TryGetValue() KeyValuePair<T, K> 的非泛型形式:DictionaryEntry List 由ILi ...

  10. unity 改变场景

    public class GameManager : MonoBehaviour { public void OnStartGame(int sceneName) { SceneManager.Loa ...