UseCompressedOops 压缩指针、JOL内存分布工具学习

JVM知识专栏JVM-火种,持续更新,喜欢请关注😍 

目录

为什么需要压缩

压缩命令

验证

项目调用

命令行查看

数据验证


为什么需要压缩

通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。对于那些将要从32位平台移植到64位的应用来说(假如编译和运行环境同为32或同为64不需要手动开启),平白无辜多了1/2的内存占用,这是开发者不愿意看到的。幸运的是,从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数。

压缩命令

在jvm参数中加入 -XX:+UseCompressedOops

验证

使用Oracle提供的实时内存布局工具jol进行查看实时内存,jol工具有两种使用方式,第一种是项目引入jar包,调用api打印。第二种是通过命令行查看。

项目调用

pom中加入maven配置,手动获取地址maven

org.openjdk.joljol-core
public static void main(String[] args) {int i = 1;//查看对象内部信息System.out.println(ClassLayout.parseInstance(i).toPrintable());//查看对象外部信息System.out.println(GraphLayout.parseInstance(i).toPrintable());//获取对象总大小System.out.println("size : " + GraphLayout.parseInstance(i).totalSize());
}

可以看出总共占用16字节,其中对象头信息占用了12字节,int对象占用了4个字节。java基本类型的内存占用情况:

命令行查看

先下载jar包,jol-cli-0.9-full.jar,注意:和项目配置的jar包不同。命令切到jar所在包下,几种常见命令如下

获取对象内部信息,即对象内的字段布局、标题信息、字段值、关于对齐丢失的数据

java -jar jol-cli/target/jol-cli.jar internals java.util.HashMa

获取外部对象,即从实例中可以访问的对象、它们的地址、通过可达性图的路径等

java -jar jol-cli/target/jol-cli.jar externals java.util.PriorityQueue

获取不同虚拟机模式下的估计对象布局

java -jar jol-cli/target/jol-cli.jar estimates java.math.BigInteger

在不同的VM模式下使用堆转储并计算感知的内存占用

java -jar jol-cli/target/jol-cli.jar heapdump heapdump.hprof

数据验证

对于那些将要从32位平台移植到64位的应用来说会有1.5倍内存占用(假如编译和运行环境同为32或同为64不需要手动开启),我的编译和运行环境都是64位,所以不需要手动开启压缩。只能试下手动关闭压缩来验证内存占用了,使用命令-XX:-UseCompressedOops,打印结果如下

同样的代码占用内存24字节,比开启压缩多了8字节,多了4字节的对象头和4字节对齐丢失数据,印证了不做指针压缩时内存消耗是正常情况的1.5倍。

参考资料

openjdk.jol

JVM优化之压缩普通对象指针(CompressedOops)

HotSpot JVM 中的对象指针压缩

一个int占多少个字节?


 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部