【问题标题】:G1: What are the differences between mixed gc and full gc?G1:混合gc和full gc有什么区别?
【发布时间】:2016-02-13 13:58:51
【问题描述】:

对于垃圾优先收集器,young gc 表示仅在年轻代中执行 gc,mixed gc 将同时清理年轻代和老年代。

那么什么是full gc?为什么它比混合 gc 持续时间更长?

我进行了一些搜索,但没有找到任何解释 full gc 的帖子。

【问题讨论】:

    标签: java garbage-collection jvm g1gc


    【解决方案1】:

    来自 Oracle G1 GC blogtechnetwork article

    年轻的 GC:

    Young GC的收集集只包含young/survivor区域。

    混合 GC:

    混合 GC 的收集集既包括年轻/幸存者区域,也包括老区域。

    巨大的对象和巨大的分配

    对于 G1 GC,任何超过一半区域大小的对象都被视为“巨大的对象”。这样的对象直接在老年代分配到“Humongous regions”中。 这些 Humongous 区域是一组连续的区域。

    Dead Humongous 对象在清理阶段结束时被释放,在整个垃圾回收周期期间也是如此。

    为了减少复制开销,Humongous 对象不包含在任何撤离暂停中。 一个完整的垃圾回收周期将 Humongous 对象压缩到位。

    Full GC 通常会清理整个堆 - Young 和 Tenured 空间(老一代)

    另一方面,无论 GC 类型如何,您都必须担心“应用程序线程停止”的时间:年轻 GC 或 Full GC 等。

    【讨论】:

    • 事实上我已经阅读了这篇文章。 Generally Full GC cleans entire Heap 回答我的问题。谢谢!
    • 还有一个问题:G1在执行full gc时会使用什么算法? Full GC 会因为清理所有区域而慢得多?
    • Full GCs:目前G1 full gc是单线程的,速度很慢,我们应该尽量避免full gcs。
    • 每次巨量分配发生时 jvm 是否打印日志?
    【解决方案2】:

    g1 将堆划分为多个区域,其中年轻代和老年代分别由多个区域组成。 年轻的 GC 收集一些区域(不是全部),但是,它们都分配给年轻代。混合 GC 收集一些区域(不是全部),一些属于年轻代,至少一个属于老年代。完整的 GC 会收集所有区域,从而收集年轻代和年老代。

    【讨论】:

      【解决方案3】:

      在正常情况下,G1 应该只运行年轻和混合收集来满足其暂停时间目标。

      Full GC 是一种后备机制,可能会违反这些目标。它们发生在混合 GC 无法跟上分配的速度、无法满足巨大分配或使用 System.gc() 和其他一些条件请求 GC 时。

      使用-XX:+PrintGCDetails 进行日志记录应包含完整收集的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-21
        • 2021-07-11
        • 2012-02-07
        • 2018-10-15
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多