+-
java – 在JVM的压缩Oops背后捣蛋
所以我理解现在默认情况下在HotSpot VM中启用了压缩oops.从 Java SE 6u23开始,它通过VM选项-XX:UseCompressedOops支持此功能.我知道它允许有效的CPU缓存利用率,因为CPU缓存可以容纳大量的引用,而不是它们必须处理64位大小的引用.但我不明白的是,如何只使用32位JVM可以处理多达264个地址.

为了简化问题,我们如何仅使用2位来处理多达24个存储器地址?这种地址方案可能的编码/解码是什么?

最佳答案
有关压缩oops的详细说明,请参阅John Rose @ Oracle的 “Compressed oops in the Hotspot JVM”文章.

TL; DR版本是:

>在现代计算机体系结构中,内存地址是字节地址,
> Java对象引用是指向word1开头的地址,
>在64位机器上,字对齐意味着对象引用/地址的底部3位为零2
>因此,通过将地址向右移3位,我们可以将64位地址的35位“压缩”为32位字,
>并且,可以通过将3位向左移位来完成解压缩,这将3个零位置回,
> 35位寻址允许我们使用在64位计算机上适合32位(半)字的压缩oop来表示最多32 GB堆内存的对象指针.

请注意,这仅适用于64位JVM.我们仍然需要能够处理包含(最多)32 GB heap1的内存,这意味着64位硬件地址(在现代CPU /计算机体系结构上).

另请注意,这样做会受到轻微的惩罚;即在常规参考和压缩参考之间转换所需的移位指令.然而,另一方面是消耗的实际内存较少3,因此内存缓存通常更有效.

1 – 这是因为现代计算机体系结构针对字对齐的内存访问进行了优化.

2 – 这假设您没有使用-XX:ObjectAlignmentInBytes来增加对齐的默认(和最小)值为8个字节.

3 – 实际上,内存节省是特定于应用程序的.它取决于平均对象对齐浪费,参考与非参考字段的比率等.如果考虑调整对象对齐,它会变得更复杂.

To simplify the problem how can we address up to 24 memory addresses using just 2 bits? What can be a possible encoding/decoding of such an address scheme?

您无法处理24字节地址.但是你可以使用2位字地址来寻址22个字地址(假设32位字).如果您可以假设所有字节地址都是字对齐的,那么您可以将4位字节地址压缩为2位字地址,方法是将其移位2位.

点击查看更多相关文章

转载注明原文:java – 在JVM的压缩Oops背后捣蛋 - 乐贴网