1 查看
$ java -XX:+PrintCommandLineFlags -version
-XX:-UseCompressedClassPointers -XX:-UseCompressedOops
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops
2
JDK1.8之后默认开启这两个压缩
- 当堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址
- 当堆内存大于32G时,压缩指针会失效,会强制使用64位(即8字节)来对java对象寻址, 那这样的话内存占用较大,会增加GC压力等等
3
- 对象头信息:64位平台下,原生对象头大小为16字节,压缩后为12字节
- 对象的引用类型:64位平台下,引用类型本身大小为8字节,压缩后为4字节
- 对象数组类型:64位平台下,数组类型本身大小为24字节,压缩后16字节