java 压缩oop_JVM优化之压缩普通对象指针(CompressedOops)
通常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)相关推荐
- RLE压缩及优化--图片压缩
RLE压缩及优化--图片压缩 分类: 开发经验以及优化 2005-03-23 17:55 535人阅读 评论(0) 收藏 举报 简单的说RLE压缩就是将一串连续的相同数据转化为特定的格式达到压缩的目的 ...
- java 指针 地址压缩_JVM优化之压缩普通对象指针(CompressedOops)
通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址). 对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不 ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...
- java压缩对象_Java 对象指针压缩
很久之前就看到过 Java 对象指针压缩这个技术,只是一直没具体想为什么要偏移 3 位,好吧,最近才知道原因是因为大多数 JVM 实现都是采用 8 位对齐,所以二进制位中的后三位都是 0. Let's ...
- java实现对pdf文件压缩,拆分,修改水印,添加水印
最近要实现一个文件上传,并且在线预览上传文件的功能,设计思路是:把上传的文件通过openoffice转成pdf文件,并将pdf文件以流的形式返回到浏览器,由于上传的部分文件过大,转成pdf后传回前端浏 ...
- 浅谈BERT/Transformer模型的压缩与优化加速
©作者 | 姚益武 单位 | 阿里巴巴集团 研究方向 | AI算法与工程架构 前言 BERT/Transformer 结构及其变体,已成为自然语言处理(NLP).语音识别 (ASR)等领域的主流序列建 ...
- java图片的导出,并压缩
java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* @param request* @param response*/@ ...
- lzma java sdk,Java LZMA 磁盘与内存压缩实现
LZMA(Lempel-Ziv-Markov chain-Algorithm),是一个Deflate和LZ77算法改良和优化后的压缩算法,它类似于LZ77的字典编码机制,在一般的情况下压缩率比bzip ...
- Java导出多个excel压缩成zip下载
Java导出多个excel压缩成zip下载 maven <!--hutoos工具类根据需要可以导入不同的模块,我这里是导入全部的模块--><dependency><gro ...
最新文章
- 金蝶K/3 BOS产品培训教案
- angular6 mysql_Angular6项目搭建
- 常见SMT极性元器件识别方法(图解)
- shell中获取本机ip地址
- python集合数据对象_python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象...
- 【机器学习】逻辑回归模型
- oracle sql优化指导,基于Oracle的sql优化(1)
- Linux的目录说明
- TCP如何保障可靠性
- 【NLP基础】手把手带你fastText文本分类(附代码)
- java 反序列化 怎么知道类_理解java中的序列化与反序列化
- 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 序言
- CAM350 10.5完美精减版
- 计算机网络施工组织设计,06网络系统施工组织设计方案.doc
- Python开发——16.HTML
- 锤子手机关闭位置服务器,技巧:锤子手机的4个隐藏小技巧 处处有情怀
- AIO600 IPPBX电话交换机对接联通移动IMS服务器
- web高级前端面试实战总结
- win10有信号没有网络连接到服务器,win10系统显示网络连接正常但没有网络,无法上网的办法介绍...
- maven子模块之间互相引入依赖,pom文件报错
热门文章
- 中国二苯甲酰甲烷市场运营模式及市场供需预测报告2022-2028年
- android安卓切换音频声道-耳机-外放-蓝牙-实用功能系列
- AI杂谈:从洗衣机到老鼠屁股
- shiro中登录的时候url地址栏带jsessionid的两种方式
- 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest K. The Robot
- 【Java习题】判断体重指数
- SpringBootTest注解
- PyQt5学习记录(2)---QMainWindow菜单栏、状态栏和工具栏
- ACP敏捷认证考试及格线以及考试知识占比分析
- Python-Flask开发微电影网站(五)