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 实现似乎还没有最终确定,但我至少找到了一些参考资料:
JVM 实现:
- Trick behind JVM's compressed Oops
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 的目的来说很好,因为它使用这些位来存储其他信息(它的指针被标记,并且标记在那些位中)。
背景:V8 宣布了一项称为指针压缩(What's happening in V8? - Benedikt Meurer)的功能,旨在减少 64 位进程指针的内存开销。 Java 自 2010 年(自 6u23 起)以来,JVM 就有一个名为 CompressedOops 的功能。乍一看很像,后来才发现不太一样。
问题: 指针压缩技术(V8 与 JVM)之间的主要区别是什么?
V8 实现似乎还没有最终确定,但我至少找到了一些参考资料:
JVM 实现:
- Trick behind JVM's compressed Oops
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 的目的来说很好,因为它使用这些位来存储其他信息(它的指针被标记,并且标记在那些位中)。