当前位置 : 主页 > 编程语言 > java >

Java-压缩指针compressedOops

来源:互联网 收集:自由互联 发布时间:2022-07-13
JVM的堆32个G足够用了,基于这个实用需求,所以JVM有了压缩指针,请注意,并不是因为压缩指针算法而导致堆最大是32个G,不要本末倒置 额外提及以下,这就是典型的x86逻辑地址而已,


JVM的堆32个G足够用了,基于这个实用需求,所以JVM有了压缩指针,请注意,并不是因为压缩指针算法而导致堆最大是32个G,不要本末倒置

额外提及以下,这就是典型的x86逻辑地址而已,java语言弄出个高端词叫压缩指针

下图假设我这个64位电脑很厉害,支持128G内存,下面分2中情况讨论:

情况一:JVM堆顶在32G以下

Java-压缩指针compressedOops_开发语言

为了更加明确最高位小于32G(顶端不超过)这种情况,下面的图2也属于最高位不超过32G,很明显图2的堆大小比图1的要小

Java-压缩指针compressedOops_字节对齐_02

对于这种堆顶端不超过32G的情况,没有必要使用8字节来表示一个地址,用4字节(32位)地址乘以8,同样可以表示任意一个地址,下面是示例

假设对象内存地址是​​0x00 00 00 00 FF FF F0 00​​​,那么用​​0x00 00 0F FF FF​​表示就可以,当使用的时候,可以直接用0xFFFFF乘8,得到0xFFFFF000

假设对象内存地址是​​0x00 00 00 00 00 0A B0 00​​​,那么用​​0x00 00 00 00 AB​​表示就可以,当使用的时候,可以直接用0xAB乘8,得到0xAB000

假设对象内存地址是0xAB123,这种假设是错误的,因为这个值不是8字节对齐(这是JVM的字节对齐而非CPU)

假设对象所在内存地址是0x1FFFFF000,这种假设是错误的,因为这个值超过了32G,在后文会讨论

综上所述:堆顶在32G 以下 的时候,压缩指针的算法是:对象在JVM中的地址用4字节地址表示,实际地址=4字节地址 乘以 8,这种用4字节地址表示8字节地址的方案,就是压缩指针,可以节省4字节空间

情况二:JVM堆顶在32G以上

下面的图表示了一个JVM的堆顶端在32G以上

Java-压缩指针compressedOops_开发语言_03


由于图3堆的顶端超过了32G,所以一个4字节数(32位)乘以8无法表示这个内存地址,对于这种情况,需要一个基址(堆的底部),然后用基址+4字节数*8,最终得出实际地址,仔细观察发下,如果这种情况的堆<4G,那么根本不需要乘以8,就能表示所有地址,所以分下面2种情况

综上所述:
堆顶端超过32G,但是堆的大小<4G:对象实际地址=基址+4字节数
堆顶端超过32G,但是堆的大小>4G:对象实际地址=基址+4字节数 乘以 8


上一篇:Java-发送邮件descriptor
下一篇:没有了
网友评论