通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。

对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。

幸运的是,从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数。

什么是 OOP ?

OOP = “ordinary object pointer” 普通对象指针。

启用CompressOops后,会压缩的对象:

• 每个Class的属性指针(静态成员变量)

• 每个对象的属性指针

• 普通对象数组的每个元素指针

当然,压缩也不是万能的,针对一些特殊类型的指针,JVM是不会优化的。

比如指向PermGen的Class对象指针,本地变量,堆栈元素,入参,返回值,NULL指针不会被压缩。

怎么启用?

在启动java时,加 -XX:+UseCompressedOops (需要jdk1.6.0_14)

CompressedOops的原理

原理,解释器在解释字节码时,植入压缩指令(不影响正常和JVM优化后的指令顺序)。

具体逻辑是,当对象被读取时,解压,存入heap时,压缩。

压缩指令伪码

! int R8; oop[] R9; // R9 is 64 bits

! oop R10 = R9[R8]; // R10 is 32 bits

! load compressed ptr from wide base ptr:

movl R10, [R9 + R8<<3 + 16]

! klassOop R11 = R10._klass; // R11 is 32 bits

! void* const R12 = GetHeapBase();

! load compressed klass ptr from compressed base ptr:

movl R11, [R12 + R10<<3 + 8]

零基压缩优化(Zero Based Compressd Oops)

零基压缩是针对压解压动作的进一步优化。

它通过改变正常指针的随机地址分配特性,强制从零开始做分配(需要OS支持),进一步提高了压解压效率。

要启用零基压缩,你分配给JVM的内存大小必须控制在4G以上,32G以下。

如果小于4G,那么JVM会使用低虚拟地址空间(low virutal address space,64位下模拟32位),这样就不需要做压解压动作了。

而对于大于32G,将采用默认的随机地址分配特性,进行压解压。

适用场景

CompressedOops,可以让跑在64位平台下的JVM,不需要因为更宽的寻址,而付出Heap容量损失的代价。

不过,它的实现方式是在机器码中植入压缩与解压指令,可能会给JVM增加额外的开销。

java 压缩oop_JVM优化之压缩普通对象指针(CompressedOops)相关推荐

  1. RLE压缩及优化--图片压缩

    RLE压缩及优化--图片压缩 分类: 开发经验以及优化 2005-03-23 17:55 535人阅读 评论(0) 收藏 举报 简单的说RLE压缩就是将一串连续的相同数据转化为特定的格式达到压缩的目的 ...

  2. java 指针 地址压缩_JVM优化之压缩普通对象指针(CompressedOops)

    通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址). 对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不 ...

  3. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )

    文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...

  4. java压缩对象_Java 对象指针压缩

    很久之前就看到过 Java 对象指针压缩这个技术,只是一直没具体想为什么要偏移 3 位,好吧,最近才知道原因是因为大多数 JVM 实现都是采用 8 位对齐,所以二进制位中的后三位都是 0. Let's ...

  5. java实现对pdf文件压缩,拆分,修改水印,添加水印

    最近要实现一个文件上传,并且在线预览上传文件的功能,设计思路是:把上传的文件通过openoffice转成pdf文件,并将pdf文件以流的形式返回到浏览器,由于上传的部分文件过大,转成pdf后传回前端浏 ...

  6. 浅谈BERT/Transformer模型的压缩与优化加速

    ©作者 | 姚益武 单位 | 阿里巴巴集团 研究方向 | AI算法与工程架构 前言 BERT/Transformer 结构及其变体,已成为自然语言处理(NLP).语音识别 (ASR)等领域的主流序列建 ...

  7. java图片的导出,并压缩

    java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* @param request* @param response*/@ ...

  8. lzma java sdk,Java LZMA 磁盘与内存压缩实现

    LZMA(Lempel-Ziv-Markov chain-Algorithm),是一个Deflate和LZ77算法改良和优化后的压缩算法,它类似于LZ77的字典编码机制,在一般的情况下压缩率比bzip ...

  9. Java导出多个excel压缩成zip下载

    Java导出多个excel压缩成zip下载 maven <!--hutoos工具类根据需要可以导入不同的模块,我这里是导入全部的模块--><dependency><gro ...

最新文章

  1. 金蝶K/3 BOS产品培训教案
  2. angular6 mysql_Angular6项目搭建
  3. 常见SMT极性元器件识别方法(图解)
  4. shell中获取本机ip地址
  5. python集合数据对象_python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象...
  6. 【机器学习】逻辑回归模型
  7. oracle sql优化指导,基于Oracle的sql优化(1)
  8. Linux的目录说明
  9. TCP如何保障可靠性
  10. 【NLP基础】手把手带你fastText文本分类(附代码)
  11. java 反序列化 怎么知道类_理解java中的序列化与反序列化
  12. 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 序言
  13. CAM350 10.5完美精减版
  14. 计算机网络施工组织设计,06网络系统施工组织设计方案.doc
  15. Python开发——16.HTML
  16. 锤子手机关闭位置服务器,技巧:锤子手机的4个隐藏小技巧 处处有情怀
  17. AIO600 IPPBX电话交换机对接联通移动IMS服务器
  18. web高级前端面试实战总结
  19. win10有信号没有网络连接到服务器,win10系统显示网络连接正常但没有网络,无法上网的办法介绍...
  20. maven子模块之间互相引入依赖,pom文件报错

热门文章

  1. 中国二苯甲酰甲烷市场运营模式及市场供需预测报告2022-2028年
  2. android安卓切换音频声道-耳机-外放-蓝牙-实用功能系列
  3. AI杂谈:从洗衣机到老鼠屁股
  4. shiro中登录的时候url地址栏带jsessionid的两种方式
  5. 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest K. The Robot
  6. 【Java习题】判断体重指数
  7. SpringBootTest注解
  8. PyQt5学习记录(2)---QMainWindow菜单栏、状态栏和工具栏
  9. ACP敏捷认证考试及格线以及考试知识占比分析
  10. Python-Flask开发微电影网站(五)