JVM垃圾收集算法和垃圾收集器(CMS/G1)

判断对象已死

可达性分析算法

以一系列“GC Roots”对象作为根起点,根据引用关系向下搜索,搜索过程所走过的路径被称为“引用链”,如果某个对象到“GC Roots”没有任何“引用链”,也就是说“GC Roots”到该对象不可达,则说明该对象没有被引用,是可回收的。

能成为GC Roots的对象

  1. 栈帧中局部变量表的中引用的对象
  2. 方法区中静态变量引用的对象、常量引用的对象
  3. 本地方法栈JNI引用的对象
  4. JVM内部引用的对象
  5. 所有被synchronized持有的对象

垃圾回收算法

标记-清除算法(Mark-Sweep)

用可达性分析算法标记存活对象,标记结束后,回收未被标记的对象。反过来用可达性分析算法标记需要回收的对象,标记结束后,回收被标记的对象。
缺点:

  1. 当要回收的对象越来越多时,标记和清除所需要的时间会增加,也就是效率会降低。
  2. 会产生内存碎片

标记-复制算法(Semispace-Copying)

将新生代分为三个区:Eden、Survivor0、Survivor1,每次只是使用Eden+s0或Eden+s1,保持总有一个区域未被使用,每次进行垃圾回收的时候,将存活的对象复制到未被使用的区域,然后清空另外两个已经使用的区域。
优点:

  1. 不会产生内存碎片
  2. 当一次Mirror GC发现Survivor放不下的时候,需要其他区域作内存分配担保(安全门)
    缺点:
  3. 如果存活对象多的情况,该算法的开销会比较大,但是多数情况下存活对象都比较少。
  4. 要增加额外的空间,相当于空间换时间。

标记-整理算法(Mark-Compact)

标记阶段还是会使用标记-清除算法,回收阶段会将存活对象移动到内存的一端,然后清除掉边界以外的对象。
优点:

  1. 不会产生内存碎片
    缺点:
  2. 需要较长时间的Stop The World
  3. 需要更新所有引用存活对象的地方

垃圾收集器

CMS(Concurrent Mark Sweep)

一款使用标记-清除算法的老年代收集器,采用增量更新算法解决并发标记问题
清理过程主要有以下四个阶段:

  1. 初始标记
    标记与“GC Roots”直接关联的对象,需要STW
  2. 并发标记
    从“GC Roots”直接关联的对象开始遍历整个对象图,不需要STW
  3. 重新标记
    整理并发标记阶段中由于用户线程导致标记发生变动的那部分标记,需要STW
    4.并发清除
    清除已死对象,不需要STW

分析:
1.并发阶段需要(处理器核心数+3)/4的回收线程数量,也就是核心在4以下时效果不好,会和用户线程抢过多的资源
2.由于是标记-清除算法而且清除阶段与用户线程一起进行,只要不STW那么就会一直产生垃圾(“浮点垃圾”),所以要给老年代预留一定区域给用户线程,否则老年代内存不足会触发“并发失败”,临时启动Serial Old(标记整理算法收集器)重新GC,那STW的时间就会很长了,老年代预留空间这个阈值可以通过XX:CMSIniailtingOccu-pancyFraction来设置

  1. 因为标记-清除算法会产生内存碎片,所以CMS在几次不整理内存碎片的Full GC后,会在下一次进行Full GC的时候进行碎片整理

G1 收集器

一个可以面向堆任意部分进行收集的标记-复制算法+标记-整理算法垃圾收集器,将堆划分为多个Region(1MB-32MB),从而划分出多个Eden、Survivor、老年代,其中大于Region一半的对象会被划分到Humongous区域,使用原始快照算法解决并发标记问题
清理过程主要有以下四个阶段:

  1. 初始标记
    标记与“GC Roots”直接关联的对象,需要STW
  2. 并发标记
    从“GC Roots”开始遍历整个对象图,遍历完后需要处理SATB记录下的引用发生变化的部分,不需要STW
  3. 最终标记
    整理并发标记阶段中遗留下来的少量SATB记录引用变化的部分,需要STW
  4. 筛选回收
    对每个Region的回收价值进行计算排序,根据用户所期望的停顿时间,制订回收计划,然后清除已死对象,由多个线程并行完成,需要STW

分析:
1.由于分了多个Region所以处理指针跨代问题就需要为每个Region制作卡表,会占用较多的对空间
2.相比增量更新算法,使用原始快照算法能减少并发标记和重新标记的消耗
3.G1需要更多的内存去划分Region,内存资源充足的情况比CMS更占优势

内存分配与回收策略

  1. 对象优先分配在Eden
  2. 大对象直接放入老年代
  3. 长期存活的对象将放入老年代
  4. 空间担保策略
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270