
为了简化问题,我们如何仅使用2位来处理多达24个存储器地址?这种地址方案可能的编码/解码是什么?
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背后捣蛋 - 乐贴网