目录:
java虚拟机汇总

  1. class文件结构分析
    1).class文件常量池中的常量项结构
    2). 常用的属性表的集合
  2. 类加载过程
    1).类加载器的原理以及实现
  3. 虚拟机结构分析
    1).jdk1.7和1.8版本的方法区构造变化
    2).常量池简单区分
  4. 对象结构分析
    1).压缩指针详解<<== 现在位置
  5. gc垃圾回收
  6. 对象的定位方式

为什么要引入压缩指针(明白的跳过)

先要明白:
32位操作系统可以寻址到多大内存 答:4g 因为 2^32=4 * 1024 * 1024=4g
64位呢?答:近似无穷大

为什么要用64位操作系统 答:因为连你家电脑的内存都不止4g了吧,你用8g的内存在32位电脑上是只有4g有效的,而4g满足不了我们的需求

可是用64位有些那些问题?
答:64位过长,给我们寻址带宽和对象内引用造成了负担

什么负担?往下看!

同一个对象存在堆里会花费更多的空间!!!!

口说无凭,首先我们计算下同一个对象在不同操作系统的堆中存放的大小

下面的东西是一个对象占用的字节数,

对象头
32位系统,占用 8 字节(markWord4字节+kclass4字节)
64位系统,开启 UseCompressedOops(压缩指针)时,占用 12 字节,否则是16字节(markWord8字节+kclass8字节,开启时markWord8字节+kclass4字节)
实例数据
boolean 1
byte 1
short 2
char 2
int 4
float 4
long 8
double 8
引用类型
32位系统占4字节 (因为此引用类型要去方法区中找类信息,所以地址为32位即4字节同理64位是8字节)
64位系统,开启 UseCompressedOops时,占用4字节,否则是8字节
对齐填充
如果对象头+实例数据的值不是8的倍数,那么会补上一些,补够8的倍数

好了开始举例

假设有一个对象

class A{int a;//基本类型B b;//引用类型
}

32位操作系统 花费的内存空间为
对象头-8字节 + 实例数据 int类型-4字节 + 引用类型-4字节+补充0字节(16是8的倍数) 16个字节

64位操作系统
对象头-16字节 + 实例数据 int类型-4字节 + 引用类型-8字节+补充4字节(28不是8的倍数补充4字节到达32字节) 32个字节

同样的对象需要将近两倍的容量,(实际平均1.5倍),所以需要开启压缩指针:

64位开启压缩指针 对象头-12字节 + 实例数据 int类型-4字节 + 引用类型-4字节+补充0字节=24个字节
开启后可以减缓堆空间的压力(同样的内存更不容易发生oom)

压缩指针是怎么实现的

JVM的实现方式是
不再保存所有引用,而是每隔8个字节保存一个引用。例如,原来保存每个引用0、1、2…,现在只保存0、8、16…。因此,指针压缩后,并不是所有引用都保存在堆中,而是以8个字节为间隔保存引用。
在实现上,堆中的引用其实还是按照0x0、0x1、0x2…进行存储。只不过当引用被存入64位的寄存器时,JVM将其左移3位(相当于末尾添加3个0),例如0x0、0x1、0x2…分别被转换为0x0、0x8、0x10。而当从寄存器读出时,JVM又可以右移3位,丢弃末尾的0。(oop在堆中是32位,在寄存器中是35位,2的35次方=32G。也就是说,使用32位,来达到35位oop所能引用的堆内存空间)
仔细看图~ 仔细看图 ~仔细看图

哪些信息会被压缩?
1.对象的全局静态变量(即类属性)
2.对象头信息:64位平台下,原生对象头大小为16字节,压缩后为12字节
3.对象的引用类型:64位平台下,引用类型本身大小为8字节,压缩后为4字节
4.对象数组类型:64位平台下,数组类型本身大小为24字节,压缩后16字节

哪些信息不会被压缩?
1.指向非Heap的对象指针
2.局部变量、传参、返回值、NULL指针

总结:

在JVM中(不管是32位还是64位),对象已经按8字节边界对齐了。对于大部分处理器,这种对齐方案都是最优的。所以,使用压缩的oop并不会带来什么损失,反而提升了性能。

压缩指针32g指针失效问题

讲到这应该很明了了,因为寄存器中3的32次方只能寻址到32g左右(不是准确的32g,有可能在31g就发生指压缩失效),所以当你的内存超过32g时,jvm就默认停用压缩指针,用64位寻址来操作,这样可以保证能寻址到你的所有内存,但这样所有的对象都会变大,实际上未开启开启后的比较,40g的对象存储个数比不上30g的存储个数

jvm压缩指针原理以及32g内存压缩指针失效详解相关推荐

  1. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解

    Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...

  2. java内存 海子_Java虚拟机:JVM内存模型和volatile详解

    JVM内存模型和volatile详解 Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内 ...

  3. php java内存占用_PHP内存溢出优化代码详解

    相信很多人做大批量数据导出和数据导入的时候,经常会遇到PHP内存溢出的问题,在解决了问题之后,总结了一些经验,整理成文章记录下. 优化点 1.优化SQL语句,避免慢查询,合理的建立索引,查询指定的字段 ...

  4. ptmalloc内存分配和回收详解(文字版)

    ptmalloc内存分配和回收详解(文字版) 进程默认内存布局(x86) 从进程的内存布局可知,.bss段之上的这块分配给用户程序的空间被称之为heap,start_brk指向heap的开始,而brk ...

  5. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...

    上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 publi ...

  6. 共模扼流圈的工作原理与作用以及特点和应用详解

    共模扼流圈的工作原理与作用以及特点和应用详解 - 电子常识 - 电子发烧友网 http://www.elecfans.com/dianzichangshi/20170609523118.html 共模 ...

  7. 图像仿射变换原理3:仿射变换类型及变换矩阵详解

    ☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 仿射变换博文传送门(带星号的为付费专栏文章): *图像仿射变换原理1:齐次坐标来龙去脉详解 ...

  8. 【数据的存储】浮点数在内存中的存储详解【超详细的保姆级别教程,让面试官心服口服】手撕浮点数存储使用方式

    [数据的存储]浮点数在内存中的存储详解[超详细的保姆级别教程,让面试官对你心服口服]手撕浮点数存储使用方式 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客 ...

  9. C指针原理(42)-内存管理与控制

    C语言的stdlib库提供了内存分配与管理的函数: 1.通过调用calloc.malloc和realloc所分配的空间,如果连续调用它们,不能保证空间是顺利或连续的.当分配成功后,函数将返回一个指针, ...

最新文章

  1. CVPR 2021:记一次神奇的 Rebuttal 经历
  2. 怎么样在c#程序中放音乐
  3. 180508 - 解决有关VIVO的2018-04-01安全补丁导致的APP闪退问题
  4. Elasticsearch 存储模型
  5. Android --- 漂亮的 Loader 加载动画
  6. php 张开收缩显示,js实现可以点击收缩或张开的悬浮窗
  7. 神舟t6ti-x5刷蓝天新版BIOS教程 可提升0.5G睿频 模具N85xHKx/HJx
  8. html5控制视频暂停,使用jQuery控制HTML5视频播放/暂停
  9. 自动目录中的页码格式-1-变为为1
  10. matlab interp1 spline,中国大学MOOC: MATLAB/Octave函数interp1中有一个描述插值方法的参数,其中spline表示...
  11. linux 配额不起作用,Linux 配额
  12. mysql中as是什么意思_数据库中as是什么意思
  13. 应用Scratchbox构建基于CF卡的嵌入式Linux系统
  14. php codesniffer 代码规范,PHP_CodeSniffer自定义代码规范规则
  15. c语言批量重命图片,图片文件批量重命名的3种方法
  16. 系统操作问题:无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动--亲测解决
  17. pc投屏android软件,Scrcpy安卓电脑投屏软件下载
  18. 在Docker安装Calibre-web搭建网上书城
  19. 关于华为的工作情况的一些解答
  20. 老毛桃u盘启动盘制作工具2014 v2014 完美版

热门文章

  1. C#不登录电脑启动程序
  2. java容器类---概述
  3. Hibernate继承映射
  4. HDU1881 毕业bg【0-1背包】
  5. POJ2033 LA3078 HDU1508 ZOJ2202 Alphacode【DFS+DP】
  6. HDU2083 简易版之最短距离【最值】
  7. Bailian2738 实数加法【数学】
  8. CCF NOI1061 Wifi密码
  9. matlab 时频分析(短时傅里叶变换、STFT)
  10. 强悍的 Linux —— 系统文件及其作用