如何在 JVM 中实现压缩的 ooP?

How is a compressed ooP implemented in JVM?

快速 google 搜索结果令人惊讶地一无所获。

我的问题如下:

对于 32 位架构 - 2^32 字节将是内存 space = 4GB 因此对于 4 GB 的 Java 堆,我们需要一个大小为 32 位 = 4 字节的指针。

但是,通过压缩 oop 的概念,JVM 仍然可以使用 4 字节指针,最大堆大小为 32 GB。

仔细想想,32GB = 4GB * 2^3。 这意味着我们实际上还需要 3 位,但不知何故,这些位在 storage/access.

期间被 JVM 获取 encoded/decoded

我发现这些页面无法访问:http://wikis.sun.com/display/HotSpotInternals/CompressedOops https://wikis.oracle.com/display/HotSpotInternals/CompressedOops

有人可以向我解释一下幕后发生的魔法吗?

致 Mods:我发现了一个现有问题,但它指向 https://wikis.oracle.com/display/HotSpotInternals/CompressedOops。这个 wiki 已经不存在了,你能不能允许这个问题这么久,以便有人给我指出另一个深入的 link。请。

编辑:

@Markus Mikkolainen 的回应是我找到的最简单易懂的解释: 它们是偏移量,它们用于索引 8 字节块而不是 1 字节块,因为对象是 8 字节对齐的。

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#compressedOop

这是否回答了您的问题,它们是偏移量并且它们用于索引 8 字节块而不是 1 字节块,因为对象是 8 字节对齐的。