深入了解JVM---压缩指针
什么是压缩指针
通常64位JVM消耗的内存会比32位的最多会多用1.5倍,这是因为对象指针在64位架构下,对象指针长度会翻倍。 对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。 幸运的是,从JDK 1.6 update14开始,
64 bit JVM正式支持了 -XX:+UseCompressedOops (需要jdk1.6.0_14) 这个可以压缩指针,起到节约内存占用的新参数。
什么是OOP?
OOP = “ordinary object pointer” 普通对象指针。启用CompressOops后,会压缩的对象:
- ※每个Class的属性指针(静态成员变量)
- ※每个对象的属性指针
- ※普通对象数组的每个元素指针
当然,压缩也不是万能的,针对一些特殊类型的指针,JVM是不会优化的。 比如指向PermGen(永久代)的Class对象指针,本地变量,堆栈元素,入参,返回值,NULL指针不会被压缩。
CompressedOops的原理:
32位内最多可以表示4GB,64位地址分为堆的基地址+偏移量,当堆内存<32GB时候,在压缩过程中,把偏移量/8后保存到32位地址。在解压再把32位地址放大8倍,所以启用CompressedOops的条件是堆内存要在4GB*8=32GB以内。
所以压缩指针之所以能改善性能,是因为它通过对齐(Alignment),还有偏移量(Offset)将64位指针压缩成32位。换言之,性能提高是因为使用了更小更节省空间的压缩指针而不是完整长度的64位指针,CPU缓存使用率得到改善,应用程序也能执行得更快。
零基压缩优化(Zero Based Compressd Oops):
零基压缩是针对压解压动作的进一步优化。 它通过改变正常指针的随机地址分配特性,强制堆地址从零开始分配(需要OS支持),进一步提高了压解压效率。要启用零基压缩,你分配给JVM的内存大小必须控制在4G以上,32G以下。如果GC堆大小在4G以下,直接砍掉高32位,
避免了编码解码过程 如果GC堆大小在4G以上32G以下,则启用UseCompressedOop 如果GC堆大小大于32G,压指失效,使用原来的64位(所以说服务器内存太大不好…)。
适用场景:
CompressedOops,可以让跑在64位平台下的JVM,不需要因为更宽的寻址,而付出Heap容量损失的代价。 不过,它的实现方式是在机器码中植入压缩与解压指令,可能会给JVM增加额外的开销。
参考:
【1】https://github.com/13428282016/elasticsearch-CN/wiki/%E4%BB%80%E4%B9%88%E6%98%AFjava%E5%8E%8B%E7%BC%A9%E5%AF%B9%E8%B1%A1%E6%8C%87%E9%92%88
【2】《Java性能优化权威指南》,柳飞、陆明刚 翻译
转自:https://www.cnblogs.com/happyflyingpig/p/8918675.html
深入了解JVM---压缩指针相关推荐
- jvm压缩指针原理以及32g内存压缩指针失效详解
目录: java虚拟机汇总 class文件结构分析 1).class文件常量池中的常量项结构 2). 常用的属性表的集合 类加载过程 1).类加载器的原理以及实现 虚拟机结构分析 1).jdk1.7和 ...
- JVM(六)---jvm压缩指针
一 什么是oop OOP = "ordinary object pointer" 普通对象指针. 启用CompressOops后,会压缩的对象: 1. 每个Class的属性指针(静 ...
- 2万字 + 50 张图,细说 JVM 内存分布、内存对齐、压缩指针
今天为大家带来一篇 2 万字的硬核技术文章. 本文我们将从计算机组成原理的角度详细阐述对象在JVM内存中是如何布局的,以及什么是内存对齐,如果我们头比较铁,就是不进行内存对齐会造成什么样的后果,最后引 ...
- 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用
重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...
- 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用
大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...
- JVM之压缩指针——Compressed oops
JVM之压缩指针--Compressed oops_赶路人儿-CSDN博客_压缩指针 1.32位 vs. 64位 32位与64位的对比是在2000年以后兴起的.然而64位CPU早就在超级计算机领域中得 ...
- 堆内存超过32G时,为什么压缩指针失效
对象内存布局: 对象头中的Class Pointer默认占8个字节,开启-XX:+UseCompressedOops后,为了节省空间压缩为4个字节,4*8=32位表示可寻址4G个对象,在内存空间小于3 ...
- 64位jvm的指针膨胀 和 数据补白
2019独角兽企业重金招聘Python工程师标准>>> 指针膨胀:64位jvm寻址范围较32位变成了64位,叫做指针膨胀: 64位数据补白:数据在64位jvm中存储较之32位jvm需 ...
- JVM中的对象探秘(三)- 对象的实例数据与对齐填充
引言 上一篇文章我们讲解了JVM对象内存布局的第一部分对象头,今天我们继续来讲讲剩下的两部分实例数据(Instance Data) .对齐填充(Padding). 实例数据与对齐填充 这两部分我们放在 ...
- Kafka 安装和搭建 (一)
Kafka 安装和测试 博客分类: middleware kafkazookeeperscalajvm 1. 简介 kafka (官网地址:http://kafka.apache.org)是一款分布 ...
最新文章
- linux 解决 gvfsd-smb-browse CPU 100%占用
- pytorch问题汇总
- 查看网页服务器搭建方式(Python3)
- linux mail 密码错误,linux下mail使用故障解决
- hdu 5213(容斥原理+莫队算法)
- k8s pod的创建流程图示
- MySQL中空字符串与null的区别:计数 判断 时间
- gtk+学习笔记(五)
- python 示例_带有示例的Python File close()方法
- 开源在线文档编辑工具_开源暑期实习,在线教育新工具等
- wpf image控件循环显示图片 以达到动画效果 问题及解决方案
- tomcat8修改session的JSESSIONID名称
- 重启 WMI 服务。
- php在线图片编辑,在线图片编辑_html/css_WEB-ITnose
- AppServer 灰度集群接口超时 / CPU 负载高专项问题排查
- 8月新亲测完美短视频点赞系统支持抖音+快手+刷宝+微视等所有主流短视频点赞/关注/评论系统源码
- android平板打电话,四款可接打电话平板电脑推荐
- 百度地图——多点标记及路线
- 3. Proxmox VE 配置 NTP
- 自动patch推荐:从良好调试习惯到科学哲学