JVM内存分配策略以及垃圾收集器介绍

JVM内存分配策略

  • 对象有限分配在Eden区, 如果Eden区空间不足则执行一次Minor GC. 执行Minor GC之后Eden中绝大多数的对象都会被清理, 少部分进入Suvior区. Minor GC的触发总是在分配对象空间不够时.
  • 大对象的分配直接进入老年代. 为什么这样做: 因为如果大对象分配到年轻代的话会产生大量的内存拷贝. -XX:PretenureSizeThreshold类设置直接进入老年代的对象大小.
  • 长期存活的对象晋升老年代. 经过几轮的GC之后仍然没有被回收的对象会晋升到老年代. -XX:MaxTenureSize来设置对象进入老年代的年龄限.
  • 动态年龄判断. 当S区中相同年龄对象占据的空间达到总空间的一半时则大于等于该年龄的对象晋升到老年代.
  • 空间分配担保. 在发生Minor GC的时候, 虚拟机会检查每次晋升到老年代对象大小的平均值是否大于现在老年代的剩余空间. 如果大于则改为执行一次Full GC. 如果小于, 则检查是否设置HandlePromotionFailure是否设置是否为允许担保失败, 如果允许则进行一次Minor GC, 如果不允许则改为一次Full GC. 通常为了避免频繁的执行Full GC这个个开关都打开.
    空间担保的意思是说, 执行Minor GC前, 假如年轻代空间不足, 则需要老年代来容纳现在在Suvivor区存活的对象. 因为GC还没有进行则根本不知道能够收集多少垃圾, 所以比较的值是每次晋升到老年代的平均值. 所以在执行Minor GC时如果当前老年代的剩余空间比平均值小则转换为一次Full GC.

垃圾收集器

在介绍垃圾收集器之前先说一下垃圾收集算法. 最简单的垃圾收集算法是标记-清除. 该算法的工作过程非常简单, 事先标记出要回收的对象, 然后清除. 标记清除算法的最大缺点就是容易产生内存碎片.

在此基础上人们提出了另外一种算法: 复制算法. 复制算法把内存空间分成两部分, 每次只用一块内存, 执行垃圾收集之后, 存活的对象转移到另外一块内存. 这种方式解决了内存碎片的问题, 但是空间使用率大大下降了.

基于标记清除的另外一种改进是标记整理算法, 和标记清除算法不同的是该算法在标记完成之后要先做一次内存整理. 整理的过程是这样的, 把存活的对象移动到内存的另一端. 然后把剩下的内存空间都清理掉. 标记整理算法解决了标记清除算法的内存碎片问题, 也不存在复制算法的空间浪费问题.

但是人们并没有止步, 又进一步提出了分代算法. 该算法的思想是把内存分成不同的区域: 老年代和新生代. 新生代的对象的特点是: 量大, 短命, 而老年代的对象更稳定一些. 因此可以根据不同区域的对象特点选择不同的垃圾收集算法.

了解了垃圾收集算法, 下边看一下垃圾收集器.


垃圾收集器.png

适用于年轻代的收集器

  • Serial. 单线程执行垃圾收集, 收集时要Stop the world.
  • Par New. Serial的多线程版本.
  • Parallel Scavenge. 吞吐量优先垃圾收集器. 吞吐量 = 用户代码时间 / 垃圾收集时间 + 用户代码时间

适用于老年代的收集器

  • Serial Old. Serial Old垃圾收集器是单线程的垃圾收集器, 采用"标记-整理"算法. 它是Client模式下的默认老年代垃圾收集器, 同时也是CMS的后备预案. 在并发收集器发生Concurrent Mode Failure时启用.
  • CMS 初始标记, 并发标记, 重新标记, 并发清除. 在这四个阶段中, 初始标记, 和重新标记是需要STW的, 其他都是和用户线程并发执行的. 由于CMS算法在工作过程中用户还会产生垃圾, 因此不能像其它垃圾收集器那样等到空间快满时才执行. CMS默认实在空间使用68%时就会触发垃圾回收. 这个参数是可以调节的: -XX:UseCMSInitiatingOccupancyOnly. 如果在CMS运行期间预留的空间无法满足程序的需求这时会出现一次"Concurrent Mode Failure", 出现这个异常之后, 会启用Serial Old收集器, 暂停应用进行彻底收集.
    CMS垃圾收集器还有一个缺点, 执行GC后会有碎片, 所以JVM也提供了参数用于在执行了GC之后执行一次空间整理(-XX: CMSCompactAtFullCollection). 还有一个参数用于设置执行几次GC后才执行一次空间整理(-XX:CMSFullGCsBeforeCompaction).
    CMS垃圾收集器的另外一个缺点是: 对CPU资源敏感. CMS默认启用的线程数是: CPUs + 3 / 4, 所以在CPU资源敏感的地方, CMS收集器还是会影响程序性能.
  • Parallel Old. Prrallel Old使用"标记整理算法", 它是Parallel Scavenge的老年代版本. 它和Parallel Scavenge搭配也是最是和的.
  • G1. G1收集器采用"标记整理算法", 它把Java堆内存分成了多个大小固定的块, 并且跟踪这些区域里面垃圾堆积程度, 根据允许的收集时间优先收集垃圾最多的区域. 这样可以确保在有限的时间获得最高的垃圾收集效率.
    G1最大的优势是它可以精确的控制垃圾收集时间, 一般它适用于4G以上的大堆.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容