V8 中的压缩指针实现与 JVM 的压缩 Oops 有何不同?

How does the compressed pointer implementation in V8 differ from JVM's compressed Oops?

背景:V8 宣布了一项称为指针压缩(What's happening in V8? - Benedikt Meurer)的功能,旨在减少 64 位进程指针的内存开销。 Java 自 2010 年(自 6u23 起)以来,JVM 就有一个名为 CompressedOops 的功能。乍一看很像,后来才发现不太一样。

问题: 指针压缩技术(V8 与 JVM)之间的主要区别是什么?


V8 实现似乎还没有最终确定,但我至少找到了一些参考资料:

  1. JVM 实现:

    • Trick behind JVM's compressed Oops
  2. V8 实现

我认为您提供的 link 已经包含了答案?简而言之:

JVM 的 "compressed Oops" 通过移位节省了 3 位,因此可以使用 8 字节粒度的 32 位指针寻址 2³ * 4 GB。 (至少你的 link 是这么说的;我对 JVM 一无所知,所以我无法确认或否认这是准确的信息。)

V8 的 "compressed pointers" 在 64(好吧,实际上是 48)位地址中的某处选择一个基地址 space,然后将所有堆指针存储为该基地址的 32 位偏移量,因此在此模式下可以寻址的最大堆大小为 4GB。

我猜想 JVM 也需要使用一些基地址的变体,否则移位的指针将被限制在完整地址的一个非常小且固定的子集中 space。 V8 的方法保留了 JVM 移走的位,这对 V8 的目的来说很好,因为它使用这些位来存储其他信息(它的指针被标记,并且标记在那些位中)。