一 什么是oop

  OOP = “ordinary object pointer” 普通对象指针。 启用CompressOops后,会压缩的对象:

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

    2. 每个对象的属性指针

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

  当然,压缩也不是万能的,针对一些特殊类型的指针,JVM是不会优化的。 比如指向 PermGen的Class 对象指针,本地变量,堆栈元素,入参,返回值,NULL指针不会被压缩

二 为什么使用压缩指针

在堆中,32位的对象引用(指针)占4个字节,而64位的对象引用占8个字节。也就是说,64位的对象引用大小是32位的2倍。64位JVM在支持更大堆的同时,由于对象引用变大却带来了性能问题:

增加了GC开销:64位对象引用需要占用更多的堆空间,留给其他数据的空间将会减少,从而加快了GC的发生,更频繁的进行GC。
降低CPU缓存命中率:64位对象引用增大了,CPU能缓存的oop将会更少,从而降低了CPU缓存的效率。
为了能够保持32位的性能,oop必须保留32位。那么,如何用32位oop来引用更大的堆内存呢?答案是——压缩指针(CompressedOops)。

三 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位(所以说服务器内存太大不好…)

JVM(六)---jvm压缩指针相关推荐

  1. JVM(六) - JVM调优

    前言 JVM调优主要是调整下面两个指标 停顿时间:垃圾收集器做垃圾回收中断应用执行的时间.-XX:MaxGCPauseMillis 吞吐量:垃圾收集的时间和总时间占比:1/(1+n) ,吞吐量为:1- ...

  2. jvm压缩指针原理以及32g内存压缩指针失效详解

    目录: java虚拟机汇总 class文件结构分析 1).class文件常量池中的常量项结构 2). 常用的属性表的集合 类加载过程 1).类加载器的原理以及实现 虚拟机结构分析 1).jdk1.7和 ...

  3. 2万字 + 50 张图,细说 JVM 内存分布、内存对齐、压缩指针

    今天为大家带来一篇 2 万字的硬核技术文章. 本文我们将从计算机组成原理的角度详细阐述对象在JVM内存中是如何布局的,以及什么是内存对齐,如果我们头比较铁,就是不进行内存对齐会造成什么样的后果,最后引 ...

  4. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  5. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  6. JVM之压缩指针——Compressed oops

    JVM之压缩指针--Compressed oops_赶路人儿-CSDN博客_压缩指针 1.32位 vs. 64位 32位与64位的对比是在2000年以后兴起的.然而64位CPU早就在超级计算机领域中得 ...

  7. 第五篇:初识JVM,JVM自动内存管理

    文章目录 一.前言 1.1 计算机==>操作系统==>JVM 1.1.1 虚拟与实体(对上图的结构层次分析) 1.1.2 Java程序执行(对上图的箭头流程分析) 二.JVM内存空间与参数 ...

  8. 堆内存超过32G时,为什么压缩指针失效

    对象内存布局: 对象头中的Class Pointer默认占8个字节,开启-XX:+UseCompressedOops后,为了节省空间压缩为4个字节,4*8=32位表示可寻址4G个对象,在内存空间小于3 ...

  9. JVM之JVM内存区域与内存分配(转载)

    2019独角兽企业重金招聘Python工程师标准>>> 先来看看JVM运行时候的内存区域 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区),He ...

最新文章

  1. 当专业动画师用GAN帮自己“偷懒”,几分钟就完成了几周的工作
  2. python基础===Number
  3. 期末微积分考试试题求解 :利用python求解
  4. 学号20145220《信息安全系统设计基础》第12周学习总结
  5. 天池在线编程 2020国庆八天乐 - 6. 山谷序列(DP)
  6. 选择文件对话框、保存文件对话框、选择文件夹对话框
  7. 第三节基础篇—SQL的约束
  8. 花店橱窗布置问题(FLOWER)
  9. MVC中code first方式开发,数据库的生成与更新
  10. 计算机 金融工程 专业选择,金融工程专业对计算机编程能力是个什么要求呢
  11. NOIP2015 口胡题解
  12. java咖啡系统,附源代码
  13. ubuntu18.04系统无法正常连接网络解决办法
  14. v-inline-date,类似携程,飞猪,带价格的时间选择
  15. jquery 遍历java对象_jquery中object对象循环遍历的方法
  16. 关于Scaner和BufferReader
  17. 新考纲 PMP 备考精讲
  18. beyond compare实现只比较特定关键字
  19. sshpass和scp的使用
  20. Leetcode904

热门文章

  1. 【backtrader源代码解析17】sharpe.py源代码解析(backtrader计算夏普率的方式)
  2. python应用炒股_用python炒股
  3. MIPI DSI转LVDS的桥接芯片,其应用图如下: ICN6202
  4. 建站之星 自定义html,建站之星如何设伪静态规则?建站之星伪静态设置方法!
  5. 哪吒S亮相广州车展,定位B级燃油车颠覆者
  6. 【实战】AI 怎么打麻将?
  7. 简单容易的计算机音乐,简单易上手的小型音乐制作软件 1BITDRAGON 升级 2.0
  8. 基于python和MATLAB的遗传算法优化函数最小值
  9. python爬虫爬取百度、360搜索引擎信息
  10. 浅谈基于 OpenStack 和 k8s 轻量研发私有云建设