Java 垃圾收集器与内存分配策略

本文内容来自于周志明的《深入理解 Java 虚拟机》,仅供学习交流使用。


常见的 Java 的垃圾回收(Garbage Collection,GC)算法主要分四种。

第一种是标记-清除算法。它先把可回收的对象一个个地从存储区域中标记出来,再把这些对象一个个地删除。它的缺点是,垃圾回收后,空闲的物理数据区域不是连续的。

标记-清除

第二种是复制算法,它每次执行时,都会把存活的对象从一个区域存入另一个区域。这样,既能一次性清除前一个区域,又能保证后一个区域的连续。但是它又会额外消耗一倍的存储空间。


复制

第三种则是标记-整理算法。它在标记-清除算法上做了改进,它先标记出可回收对象,再对存活的对象进行整理,最后清空边界外的对象(有点像在一个数组里删掉好几个元素后,先把后面的对象前移,再把数组尾部“多余”的对象清理掉)。


标记-整理

第四种算法是分代收集算法。它一般根据 Java 对象的存活周期将内存分为新生代和老年代两块。在新生代中,一般存储存活周期较短的对象;在老年代中,一般存储存活周期较长的对象。根据新生代和老年代的区别,这两块存储区采用不同的垃圾收集算法。新生代采用复制算法,老年代采用标记-清除或标记-整理算法。


Minor GC & Major GC

新生代中采用的是 Minor GC 算法,即复制算法。它将存储区域按照 8:1:1 的大小划分为一个 Eden 区域(以下简称 E 区)和两个 Survivor 区域(以下简称 S 区) 。执行 Minor GC 算法时,E 区域和一个 S 区域中的对象会被存入另一个 S 区中。当对象从 E 区进入 S 区时,对象的年龄会变成 1。当对象从一个 S 区复制到另一 S 区时,对象的年龄就加 1。当对象的年龄满足一定条件时,这个对象就从新生代存入老年代。

老年代中采用的是 Major GC 算法,又称为 Full GC 算法,一般也就是标记-清除或标记-整理算法。Major GC 它一般会比 Minor GC 慢 10 倍以上,因此,Major GC 也会比 Minor GC 调用次数更少。


Java 的内存分配机制与垃圾回收算法紧密相关。

新建的对象一般都存储在新生代中。但是,当新建了一个很大的对象时(对象的大小大于虚拟机参数 PretenureSizeThreshold 时),大对象会直接存入老年代。

当新生代中的存储空间不足时,会触发 Minor GC 算法清理新生代的存储区。此时,可能出现对象衰老或分配担保的情况。

有两种情况会引起对象衰老,即对象从新生代进入老年代。

第一:如果被复制的对象的年龄太大(对象的年龄大于虚拟机参数 MaxTenuringThreshold 时),该对象会直接存入老年代。

第二:如果在 S 区中相同年龄的所有对象的总大小超过了 S 区的一半,年龄大于或等于该年龄的对象就进入老年代。(无视 MaxTenuringThreshold,适应性更高)

分配担保。即新生代没有足够的存储空间时,需要“借用”老年代的空间。也就是说,老年代担保了新生代的分配空间。同样,也有两种情况会产生分配担保。

第一,对象大小大于 S 区。从 E 区存入 S 区的对象太大,S 区存不下,这个对象就会被直接存入老年代。

第二,对象数量太多。有许多存活的小对象需要保存,S 区存不下,因此,也会有一些对象被存入老年代。(但是并不知道是具体哪些对象复制到 S 区,哪些对象存入老年代)


须知,市面上常用的垃圾收集器有许多种,它们并没有统一的规则和参数,不同的收集器会有不同的内存回收行为。因此,以上只是一种可行的回收方案,并不能代表所有方案。

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

推荐阅读更多精彩内容