回答
空间担保是 JVM 的一种保护机制,它主要确保新生代经过 Minor GC
,老年代有足够的空间来存放所存活的对象。
我们知道,新生代内存区域分为三个区:Eden区、Survivor 0
区和Survivor 1
区。新建的对象直接在 Eden 区分配,当 Eden 区满了后,JVM 会触发一次 Minor GC
,Minor GC
后,JVM 会将 Eden 区和一个 Survivor 区中存活的对象复制到另外一个 Survivor 区去,如果该 Survivor 区的内存不足以容纳全部的存活对象,则 JVM 会将一部分对象存放到老年代,那如果老年代也不够呢,怎么办?
JVM 提供了空间分配担保机制,在进行 Minor GC
之前,JVM 会先检查老年代的最大可用连续空间是否大于新生代所有对象的总和。
如果大于,则表明此次 Minor GC
是绝对安全的,因为就算新生代所有的对象全部进老年代,老年代也足够。
如果小于,则 JVM 会先检查参数-X:HandlePromotionFailure
设置的值。如果为 true,则 JVM 会判断老年代的最大可用连续空间是否大于之前每一次 Minor GC
后晋升老年代的对象的平均大小,如果大于,则可以尝试进行一次 Minor GC
。如果小于或者 -X:HandlePromotionFailure
,则改为进行一次Full GC。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。