乐趣区

小师妹学JVM之Dirty-cards和PLAB

简介

分代垃圾回收器在进行 minor GC 的时候会产生什么操作呢?有没有什么提高效率的伎俩呢?明天咱们和小师妹一起来理解一下垃圾回收中的 Dirty cards 和 PLAB

分代收集器中的空间划分

小师妹:F 师兄,能再讲讲分代垃圾收集器中的空间划分吗?

分代垃圾回收器中的 Eden,Old 和 Survivor space 几个大家应该都很相熟的分代技术。

Young Gen 被划分为 1 个 Eden Space 和 2 个 Suvivor Space。当对象刚刚被创立的时候,是放在 Eden space。

当 Eden space 满的时候,就会触发 minor GC。会扫描 Eden Space 和一个 Suvivor Space。如果在垃圾回收的时候发现 Eden Space 中的对象依然无效,则会将其复制到另外一个 Suvivor Space。

就这样一直的扫描,最初通过屡次扫描发现依然无效的对象会被放入 Old Gen 示意其生命周期比拟长,能够缩小垃圾回收工夫。

Write barrier 和 Dirty cards

小师妹:F 师兄,minor GC 的时候,要将对象从 Eden 复制到 Suvivor Space,从 Suvivor Space 中复制到 Old space。GC 是怎么晓得哪些对象是要被回收,哪些是不必被回收的呢?

小师妹,GC 这里用到了一项叫做 Dirty cards 的技术。

一般来说,新的对象是调配在 Eden 空间的。然而也有些对象是间接调配在 Old space。

咱们晓得,GC 的扫描是从一些根对象开始的,这些 Root 对象包含:正在执行的办法中的本地对象和输出参数。流动的线程,加载类中的 static 字段和 JNI 援用。

而这些根对象,个别都是存储在 old space 中的。

通常来说 old space 的空间都会比拟大。每次要要找到 Eden 和 suvivor Space 中哪些对象不再被援用,须要扫描整个 old space 必定是不可取的。

所以 JVM 在这里引入了 Write barrier 的技术。HotSpot 中有两种 Write barrier,一种就是明天咱们要讲的 Dirty cards, 另外一种就是 snapshot-at-the-beginning (SATB)。SATB 通常用在 G1 垃圾回收器中,这里咱们先不做深刻的探讨。

咱们看下上图中的 Dirty cards 的应用。

Dirty cards 说起来很简略,就是每当有程序对援用进行批改的时候,咱们都会在一个 Dirty cards 的空间记录一下被批改的 memory page。

这样在 minor GC 的时候,当援用的对象被批改了之后,咱们会同步批改对应的 Dirty cards。这样每次扫描 old space 的时候,只须要抉择那些标记为 Dirty cards 的对象就能够了,防止了全局扫描。

PLAB

小师妹,F 师兄,你讲的如同很有情理的样子,上次你讲到咱们在 Eden 空间调配对象的,为了晋升调配的效率,应用了 TLAB 的计算。那么在对象从 Eden 空间晋升到 Suvivor Space 和 old Space 的时候有没有同样的技术呢?

当然有的,这个技术就叫做 PLAB(promotion local allocation buffer)。每一个线程在 survival space 和 old space 中都一个 PLAB。在晋升的时候,能够防止多线程的竞争,从而晋升效率。

咱们能够应用 -XX:+AlwaysTenure 将对象间接从 Eden space 晋升到 old space。

咱们能够应用 -XX:+PrintOldPLAB 来输入 OldPLAB 的信息。

old space 调配对象

小师妹:F 师兄,刚刚你讲到新调配的对象能够间接在 Old space,个别什么对象能够这样调配呢?

这个很好了解,如果你调配对象大小超过了 Eden space 的大小,是不是就只有 old space 能够调配对象了?

小师妹:对的,然而一般来说也不会应用这么大的对象吧。

对的,咱们能够通过设置 -XX:PretenureSizeThreshold=n 来指定对象的大小,如果对象大小大于 n,那么就间接在 old space 调配。

留神,如果这个对象的大小比 TLPB 要小,那么会首先在 TLPB 中调配。所以应用的时候要留神限度 TLPB 的大小。

总结

GC 的运行是一个比较复杂的过程,大家能够细细领会。本文如果有什么舛误之处,欢送微信我斧正。谢谢大家。

本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/jvm-dirty-card-plab/

本文起源:flydean 的博客

欢送关注我的公众号: 程序那些事,更多精彩等着您!

退出移动版