4. GC算法与种类

GC的概念

  • Garbage Collection 垃圾收集
  • 1960年,List使用了GC;GC需要完成的3件事情:
    • 哪些内存需要回收?
    • 什么时候回收?
    • 如何回收?
  • 为什么还要去了解GC和内存分配呢?
    • 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节
  • Java中,GC的对象是堆空间和方法区(永久区)
    • 只有在程序处于运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的

GC算法

引用计数法(Reference Counting)
  • 老牌垃圾回收算法
  • 通过引用计算来回收垃圾
  • 使用者:主流的Java虚拟机里面没有选用引用计数法
    • COM
    • ActionScript3:FlashPlayer
    • Python
    • Squirrel:游戏脚本领域
  • 引用计数法的问题
    • 引用和去引用伴随加法和减法,影响性能
    • 很难处理循环引用
标记清除(Mark-Sweep)
  • 最基础的收集算法,分为“标记”和“清除”两个阶段:
  1. 标记出所有需要回收的对象
  2. 在标记完成后统一回收所有被标记的对象


    标记-清除算法.png
  • 后续的收集算法都是基于这种思路并对其不足进行改进。它的主要不足有两个:
  1. 效率问题:标记和清除两个过程的效率都不高
  2. 空间问题:标记清除之后会产生大量不连续的内存碎片,内存碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾手机动作
复制算法(Copying)
  • 为了解决标记清除算法的效率问题:
  1. 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块
  2. 当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉
  • 不适用于存活对象较多的场合,如老年代;而采用这种算法来回收新生代
    • IBM研究表明,新生代中的对象98%是“朝生夕死”的
  • HotSpot虚拟机默认Eden和Survivor的大小比例是8:1
    • 每次新生代中可用内存空间为整个新生代容量的90%(80% + 10%),只有10%的内存会被“浪费”
    • 当Survivor空间不够用时,需要依赖老年代进行分配担保
  • 分配担保(Handle Promotion)
    • 如果另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代
标记压缩(Mark-Compact)
  • 适合用于存活对象较多的场合,如老年代
  1. 标记过程仍然与“标记-清除”算法一样
  2. 让所有存活的对象都向一端移动
  3. 然后直接清理掉端边界以外的内存
标记-压缩算法.png
分代思想
  • 依据对象的存活周期将Java堆进行分类,短命对象归为新生代,长命对象归为老年代。
  • 根据不同代的特点,选取合适的收集算法
  1. 少量对象存活,适合“复制算法”
  2. 大量对象存活,适合“标记清理”或者“标记压缩”

可触及性(可达性分析)

  • 基本思路:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(不可达)时,则证明此对象是不可用的
  • 可作为GC Roots的对象:
  1. 虚拟机栈(栈帧中的局部变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(即一般说的Native方法)引用的对象

Stop-The-World

  • Java中一种全局暂停的现象
  • 全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互
  • 多半由于GC引起
  1. 枚举GC Roots必须在一个能确保一致性的快照中进行:整个分析期间整个执行系统看起来就像被冻结在某个时间点上
  2. Dump线程
  3. 死锁检查
  4. 堆Dump
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  • GC 算法与种类 ■ GC的概念■ GC算法• 引用计数法• 标记清除• 标记压缩• 复制算法■可触及性■ Sto...
    bryant_gbw阅读 185评论 0 1
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,465评论 17 311
  • 一. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对...
    Stan_Z阅读 1,927评论 0 25
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,956评论 2 31
  • 写在前边的话: 好久时间没有登录简书写字 今天提笔准备开始写的时候 发现逗号键失灵了 就只能空格代替了 见谅! 杭...
    暖宝小哥阅读 620评论 0 1