[转]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)机制,用以在合适的时间触发垃圾回收. 你都了解哪 ...
随机推荐
- 当年只会C# 所以写C++就成这样了! log4cplus -> log4net
属实C++不会. 目前帮朋友弄个小项目需要小折腾一下. c# 一直采用 log4net ,c++的呢,找找有个log4cplus 知识有限,做个通用类吧.别把精力放在这里. 动手创建个静态类. 为了 ...
- EF 配置(SqlServer,Mysql)
DbProvider Mysql <system.data><DbProviderFactories><remove invariant="MySql.Data ...
- git 用不同的邮箱配置不同的ssh
首先,介绍一下配置背景: 1.有两个邮箱A@mail.com , B@mail.com 2.两个git账号,一个公司gitlab上的A@mail ,另一个github上的B@mail 3. 目标:提 ...
- jQuery九类选择器详解
(1)基本选择器 <body> <div id="div1ID">div1</div> <div id="div2ID" ...
- MIT 6.828 JOS学习笔记12 Exercise 1.9
Lab 1中Exercise 9的解答报告 Exercise 1.9: 判断一下操作系统内核是从哪条指令开始初始化它的堆栈空间的,以及这个堆栈坐落在内存的哪个地方?内核是如何给它的堆栈保留一块内存空间 ...
- WebGL入门教程(三)-webgl动画
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL动画有移动.旋转和缩放,我们将移动.旋转和缩放图形,然后将其绘制到屏幕上,称为变换(tr ...
- Python学习日志(二)
在网易云课堂看到小甲鱼的python视频,想起以前看就是看他的视频学C的虽然后来不了了之都怪我自己啦,于是决定跟着这个视频来学python啦! IDLE IDLE其实是一个python shell , ...
- Gulp常用前端流程自动化配置
前言 近期的项目全部由Grunt + LESS 转向改用Gulp + SASS 进行前端开发,也就奔着Gulp那比较好用的自定义函数而来的. 一.package.json文件配置如下: { " ...
- 通用js函数集锦<来源于网络> 【二】
通用js函数集锦<来源于网络> [二] 1.数组方法集2.cookie方法集3.url方法集4.正则表达式方法集5.字符串方法集6.加密方法集7.日期方法集8.浏览器检测方法集9.json ...
- HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash
1.HashMap的内部实现机制 HashMap是对数据结构中哈希表(Hash Table)的实现,Hash表又叫散列表.Hash表是根据关键码Key来访问其对应的值Value的数据结构,它通过一个映 ...