概述
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
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version></version>
</dependency>
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占多少个字节?
最后
以上就是无私蜻蜓为你收集整理的UseCompressedOops 压缩指针、JOL内存分布工具学习的全部内容,希望文章能够帮你解决UseCompressedOops 压缩指针、JOL内存分布工具学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复