jvm压缩指针原理以及32g内存压缩指针失效详解
目录:
java虚拟机汇总
- class文件结构分析
1).class文件常量池中的常量项结构
2). 常用的属性表的集合 - 类加载过程
1).类加载器的原理以及实现 - 虚拟机结构分析
1).jdk1.7和1.8版本的方法区构造变化
2).常量池简单区分 - 对象结构分析
1).压缩指针详解<<== 现在位置 - gc垃圾回收
- 对象的定位方式
为什么要引入压缩指针(明白的跳过)
先要明白:
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内存压缩指针失效详解相关推荐
- Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解
Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...
- java内存 海子_Java虚拟机:JVM内存模型和volatile详解
JVM内存模型和volatile详解 Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内 ...
- php java内存占用_PHP内存溢出优化代码详解
相信很多人做大批量数据导出和数据导入的时候,经常会遇到PHP内存溢出的问题,在解决了问题之后,总结了一些经验,整理成文章记录下. 优化点 1.优化SQL语句,避免慢查询,合理的建立索引,查询指定的字段 ...
- ptmalloc内存分配和回收详解(文字版)
ptmalloc内存分配和回收详解(文字版) 进程默认内存布局(x86) 从进程的内存布局可知,.bss段之上的这块分配给用户程序的空间被称之为heap,start_brk指向heap的开始,而brk ...
- InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...
上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 publi ...
- 共模扼流圈的工作原理与作用以及特点和应用详解
共模扼流圈的工作原理与作用以及特点和应用详解 - 电子常识 - 电子发烧友网 http://www.elecfans.com/dianzichangshi/20170609523118.html 共模 ...
- 图像仿射变换原理3:仿射变换类型及变换矩阵详解
☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 仿射变换博文传送门(带星号的为付费专栏文章): *图像仿射变换原理1:齐次坐标来龙去脉详解 ...
- 【数据的存储】浮点数在内存中的存储详解【超详细的保姆级别教程,让面试官心服口服】手撕浮点数存储使用方式
[数据的存储]浮点数在内存中的存储详解[超详细的保姆级别教程,让面试官对你心服口服]手撕浮点数存储使用方式 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客 ...
- C指针原理(42)-内存管理与控制
C语言的stdlib库提供了内存分配与管理的函数: 1.通过调用calloc.malloc和realloc所分配的空间,如果连续调用它们,不能保证空间是顺利或连续的.当分配成功后,函数将返回一个指针, ...
最新文章
- CVPR 2021:记一次神奇的 Rebuttal 经历
- 怎么样在c#程序中放音乐
- 180508 - 解决有关VIVO的2018-04-01安全补丁导致的APP闪退问题
- Elasticsearch 存储模型
- Android --- 漂亮的 Loader 加载动画
- php 张开收缩显示,js实现可以点击收缩或张开的悬浮窗
- 神舟t6ti-x5刷蓝天新版BIOS教程 可提升0.5G睿频 模具N85xHKx/HJx
- html5控制视频暂停,使用jQuery控制HTML5视频播放/暂停
- 自动目录中的页码格式-1-变为为1
- matlab interp1 spline,中国大学MOOC: MATLAB/Octave函数interp1中有一个描述插值方法的参数,其中spline表示...
- linux 配额不起作用,Linux 配额
- mysql中as是什么意思_数据库中as是什么意思
- 应用Scratchbox构建基于CF卡的嵌入式Linux系统
- php codesniffer 代码规范,PHP_CodeSniffer自定义代码规范规则
- c语言批量重命图片,图片文件批量重命名的3种方法
- 系统操作问题:无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动--亲测解决
- pc投屏android软件,Scrcpy安卓电脑投屏软件下载
- 在Docker安装Calibre-web搭建网上书城
- 关于华为的工作情况的一些解答
- 老毛桃u盘启动盘制作工具2014 v2014 完美版