首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「每日五分钟,玩转JVM」:指针压缩

「每日五分钟,玩转JVM」:指针压缩

作者头像
山禾说
发布2019-12-02 21:34:41
6620
发布2019-12-02 21:34:41
举报
文章被收录于专栏:Vi的技术博客Vi的技术博客

64位JVM和32位JVM

最初的时候,JVM是32位的,但是随着64位系统的兴起,JVM也迎来了从32位到64位的转换,32位的JVM对比64位的内存容量比较有限,但是我们使用64位虚拟机的同时,也带来了一个问题,64位下的JVM中的对象会比32位中的对象多占用1.5倍的内存空间,这是我们不想看到的(又要马儿跑,又要马儿不吃草可还行?),但是机智的程序员不会屈服,所以在JDK 1.6的版本后,我们在64位中的JVM中可以开启指针压缩(UseCompressedOops)来压缩我们对象指针的大小来帮助我们节约内存空间,拿JDK 8来说,这个指令是默认开启的。

如果我想要知道我们电脑上安装的JVM是32位的还是64位的,可以通过下面的这个命令去查看

如果我们的系统是64位的,当我们输入 java-d32的时候会提示不支持32位的JVM,或者我们通过 java-version也可以看到:

指针压缩

当我们启用了 -XX:+UseCompressedOops之后,我们原本的OOP(Ordinary Object Pointer,普通对象指针)就会被压缩,当然也不是所有的对象都会被压缩,只有 以下几种的对象才会被压缩

对象的全局静态变量(类属性) 对象头信息 对象的引用类型 对象数组类型

而以下几种对象则不能被压缩:

指向PermGen的Class对象指针 局部变量 传参 返回值 NULL指针

指针压缩的大概原理:

  • 通过对齐,还有偏移量将64位指针压缩成32位。
  • 零基压缩是针对压缩解压动作的进一步优化。它通过改变正常指针的随机地址分配特性强制堆地址从零开始分配

这里需要注意:32位HotSpot VM是不支持UseCompressedOops参数的,只有64位HotSpot VM才支持。

下面是32bit和64bit下的压缩或者不压缩所占的大小~

在内存结构中的不同

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vi的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 64位JVM和32位JVM
  • 指针压缩
  • 下面是32bit和64bit下的压缩或者不压缩所占的大小~
  • 在内存结构中的不同
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档