[转]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. 用opencsv文件读写CSV文件

    首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...

  2. Unity IOS Build的Graphics API最好是固定Opengl ES 2.0

    不要选择Automatic也不要选择Metal,因为这个选项可能会导致app在Iphone6上出现crash. 一个类似的crash堆栈: http://stackoverflow.com/quest ...

  3. 网站Bannr适应大小屏幕,图片始终居中不被压缩

    网站banner一般都是2000px以上的宽度,为了让在小的屏幕上图片不被压缩并且是居中表现: 方法是让包裹图片全部的那个大容器始终正居中 <!-- banner --> <div ...

  4. Tween Animation----Rotate旋转动画

    activity_main.xml布局里 在res/下面新建一个anim文件夹用来保存动画的xml属性 我们在anim文件夹下面创建一个rotate.xml文件 代码如下: <?xml vers ...

  5. centos 6.5 yum安装 mysql 5.6

    1. 查看系统里面有没有mysql 的repo   yum repolist all | grep mysql 2. 如果没有发现,则需要配置repo 注意,如果要使用5.7 或者其他任何版本,只能有 ...

  6. time的用法

    线程计时器(System.Threading.Timer) System.Windows.Threading.DispatcherTimer tRecorderTimer; if (tRecorder ...

  7. java.lang.OutOfMemoryError: PermGen space错误解决方法

    1. MyEclipse 中报 PermGen space       window--> preferences-->Myclipse-->Servers-->Tomcat- ...

  8. [资料分享]ACCESS2013 零基础到精通

    Microsoft Office Access是由微软发布的关系数据库管理系统.它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft O ...

  9. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

    前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...

  10. [翻译svg教程]svg中矩形元素 rect

    svg 元素<rect> 是一个矩形元素,用这个元素,可以你可以绘制矩形,设置矩形宽高,边框的宽度颜色,矩形的填充颜色,是否用圆角等 rect 示例 <svg xmlns=" ...