我很难理解Java 19中压缩指针的工作原理,需要帮助。
在Java 11中,对于小于32GiB的堆(使用压缩指针),引用大小为4字节,对于更大的堆,引用大小为8字节。在Java 19中,即使是更大的堆,它们似乎也只占用4个字节(如何实现?)。
细节:
Java版本:OpenJDK Java 11.0.12和OpenJDK Java 19.0.1
命令行:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xlog:gc -Xlog:gc+heap+coops -Xms41g -Xmx41g -XX:+AlwaysPreTouch
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xlog:gc -Xlog:gc+heap+coops -Xms31g -Xmx31g -XX:+AlwaysPreTouch
代码: https://github.com/cornelcreanga/fun/blob/master/src/main/java/com/ccreanga/various/RandomAllocate.java - 该代码来自https://shipilev.net/jvm/anatomy-quarks/23-compressed-references/
使用Java 11和19运行此代码,您会发现对于大于32 GiB的堆,Java 19的内存占用量比Java 11低。对于较小的堆,大小几乎相同。