[转]GC简介
[转]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 标记清除
)过程
- 第一次扫描:以变量或运行栈作为根,从根开始将可能被引用的对象进行标记,将没被标记的对象进行垃圾回收
- 第二次扫描:将全部对象进行扫描,对没有被标记的对象进行垃圾回收,扫描的同时还需要将存活的对象的标记去除
)缺点
- 处理时间与对象数量相关,在大量对象且极少存活的情况下,效率不明显
- 由复制收集解决这一问题
2.1.3 复制收集
)过程
- 扫描一遍:将根对象复制到新开辟的内存空间,再用复制的对象所能引用的对象进行递归复制
- 清除旧空间
)优缺点
- 扫描一遍就相当于标记清除的标记阶段,清除阶段开销极小
- cache局部性,复制收集按照引用将关联的对象复制到新空间,在内存空间里距离较近,效率会提高
- 在存活对象大比列存在的情况下,复制对象的开销会加大
2.2 引用计数
2.2.1 原理
当对象引用发生变化时,利用引用计数更新对象的状态,判断对象的生死
2.2.2 引用计数
)过程
在对象内部保持一个对该对象的引用计数,当引用发生增减时进行更新
)优缺点
- 能够做到立即释放垃圾,中断时间短
- 无法释放循环引用的对象
- 在并行环境下,需要对计数操作进行加锁互斥,开销较大
2.3 跟踪回收和引用计数的结合
2.3.1 分代回收
)原理
大部分对象在短时间里会成为垃圾,而经过一定时间仍然存活下来的往往拥有较长的寿命,所以增加新生的对象的扫描,减少老生对象的扫描
)过程
- GC小回收:利用复制收集,将新空间标记为老生代或利用标记清除方式将存活对象标记为老生代,清除死亡对象
- GC大回收(偶尔进行):以全部区域为对象进行GC操作
)记录集
- 在对象引用发生改变时,如果老生代对象引用到了新生代对象,则将引用记录加入到记录集
- 需要时刻保持更新,新生代被老生代引用的瞬间就必须更新
)写屏障
需要将添加到记录集的操作嵌入到对象修改的地方,对所有涉及修改对象的地方进行保护
)优缺点
- 减少了需要扫描的对象,缩短GC时间
- 算法受到程序行为,分代数量,大回收的触发条件的影响
2.3.2 增量回收
)原理
- 将GC操作分为多个阶段进行
- 与分代回收相似,需要增加写屏障,防止存活的对象被清除,而该清除的对象没被清除
)优缺点
中断时间取决于对象的数量,在牺牲总GC时间的情况下,缩短中断时间
2.3.3 并行回收
)原理
- 程序运行和GC同时进行
- 需要写屏障对状态进行实时更新
)特点
- 在GC的某个阶段还是需要暂停程序的运行,无法完全与程序并行
- 未来趋势
2.4 GC大一统理论
所有的GC算法都是跟踪回收和引用计数的结合,两者相互独立,对其中一方进行改善的技术之中必然存在对另一方的改善技术,而其结果只是两种的结合
3 思维导图

总结
原文链接:http://www.cnblogs.com/cposture/p/4845189.html
[转]GC简介的更多相关文章
- jvm-垃圾回收gc简介+jvm内存模型简介
gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...
- JVM内存管理------GC简介
为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让 ...
- JVM内存管理之GC简介
为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题 ...
- JVM的GC简介和实例
本文是一次内部分享中总结了jvm gc的分类和一些实例, 内容是introduction级别的,供初学人士参考.成文仓促,难免有些错误,如果有大牛发现,请留言,我一定及时更正,谢谢!JVM内存布局主要 ...
- JVM内存管理(一)--GC简介
GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪些问题呢,粗略的来说,主要有以下几点. 1.哪些对象可以被回收. 2.何时回收 ...
- jvm堆内存和GC简介
最近经常遇到jvm内存问题,觉得还是有必要整理下jvm内存的相关逻辑,这里只描述jvm堆内存,对外内存暂不阐述. jvm内存简图 jvm内存分为堆内存和非堆内存,堆内存分为年轻代.老年代,非堆内存里只 ...
- 【原创】GC/垃圾回收简介
GC简介 1 GC机制 1.1 对象 从计算机的角度,装有数据的内存空间 1.2 作用 将内存垃圾的释放自动化 1.3 本质 将已经引用不到的对象视为死亡,将死亡的对象找出来并且作为垃圾进行回收 2 ...
- Java内存管理及GC算法
概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚 ...
- [面试] Java GC (未整理完)
Java GC简介 什么是 GC ? Java程序不用像C++程序在程序中自行处理内存的回收释放.这是因为Java在JVM虚拟机上增加了垃圾回收(GC)机制,用以在合适的时间触发垃圾回收. 你都了解哪 ...
随机推荐
- mysql导出excel文件的几种方法
方法一 用mysql的命令和shell select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id d ...
- 【前端性能】高性能滚动 scroll 及页面渲染优化--转发
本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,可以对照上面的知 ...
- 常见css垂直自适应布局(css解决方法)
css3的盒模型, css3中添加弹性盒模型,最新弹性盒模型是flex,之前为box <!DOCTYPE html> <html > <head> <titl ...
- tmux 简单命令
tmux 大概结构图: 如果你已经安装了tmux,则输入tmux会进入tmux功能界面 0. tmux ls 列出已经存在session 1. tmux new -s foo 新建session ...
- Git 创建本地仓库
前面已经搭好环境了,现在我们缺的是一个管理版本控制的仓库.这次的实验是在电脑本地创建本地仓库.指定路径 默认的位置是在你所安装Git的目录下.Git的仓库你可以建在你电脑的任何目录下(最好不要包含有中 ...
- 华为荣耀6 H60-L02/L12(联通版)救砖包【适用于无限重启】
本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限重启]说明: 1.本工具包用于华为荣耀6 H60-L02(联通版): ...
- Anaular指令详解
目录:directive() restrict replace template templateUrl scope transclude ng-transclude co ...
- T-SQL Recipes之Organizing and Archiving Data
The Problem 当我们处理存档数据或内存数据时,我们想要自定义命名表名,数据库,架构加上日期,时间,或者应用名时,用标准的TSQL来实现是比较困难的. 假设我们有一张日志表,增长速度异常快.但 ...
- kindeditor-4.1.3工具使用技巧:如何在编辑区上传图片并保存绝对路径
MVC项目开中用到了KindEditor图片上传工具,需要在编辑区内上传图片,并将图片的URL保存为符合如下格式地址,如http://192.168.0.111/uploadImg/imgName.j ...
- 【Redis】:Jedis 使用
Redis 支持很多语言, 例如C#,RUBY,JAVA 等, Jedis是redis的java版本的客户端实现 一个简单的Jedis使用 依赖第三方包jedis-2.7.2.jar commons- ...