快速理解 JVM 内存模型 对象组成 对象内存分配
创始人
2024-02-07 02:40:33

快速理解 JVM 内存模型 & 对象组成 & 对象内存分配

JVM 内存模型

JVM 内存模型分为首先在线程纬度可以分为两部分

一部分是 线程共享: 堆、元空间

  • 堆 : 大多数 new 的对象都存在于堆内,也是 GC 主要回收的空间,占据 JVM 内存的大部分
  • 元空间:存储静态信息,如 常量、静态变量、类元信息(你写的类解析出来的字节码数据),该部分内存空间是直接内存空间。在 cpu 执行权限上,内存分为 用户空间内核空间,对于 JVM 角度来说即 JVM 堆内存区域系统直接内存区域 感兴趣可以浏览文章 零拷贝

一部分是 线程独有: 线程栈、本地方法栈、程序计数器

  • 线程栈: 细分栈帧,线程在执行方法的过程中,每调用一个方法即为该方法分配一块栈帧内存空间,方法调用结束则弹出该栈帧释放栈帧内存空间,每个线程栈空间有限,当你出现循环调用,不停的往线程栈中压入栈帧时,最终就会触发 StackOverFlow 异常。可通过 -Xss 参数配置 (线程栈使用的也是非堆内存,即直接内存)
  • 程序计数器:记录当前线程方法执行位置,用于在线程切换后恢复现场继续执行。
  • 本地方法栈:java 调用本地方法(其他语言的方法,如 C 语言方法)单独区分的栈空间,原理类似于线程栈,有些虚拟机会将其和 线程栈合成一个使用。

在这里插入图片描述

对象组成

在 Java 当中对象在存储时会分为五个部分

  1. Mark Word:属于对象的固有属性,占用 8 byte (字节 ps 1 byte = 8 bit 位)
  2. Klass Pointer 对象指针, 占用 4 byte (开启指针压缩后,Java 1.6 版本后默认开启)。
  3. 数组长度,只有数组对象有,记录数组长度 占用 4 byte。
  4. 实例数据: 这个是我们在定义类时的内部成员变量的占用,是我们开发时经常操作看的到的。
  5. 对其填充: 有时有,会将对象大小补齐为 8 byte 的倍数。

所以,对于一个对象,即使你啥都没有声明,new 出来都至少要占用 8(mark word)+4(klass pointer)+4(对其填充) = 16 byte

说说指针压缩

首先 CPU 分为 32 位寻址 和 64 位寻址,32 位的 CPU 只能处理 32 位故而只能在 2^32 = 4G 内存中寻址,所以 32 位机器和系统只能支持 4G 的内存,现在大部分机器都是 64 位即 2^64 = 18446744073709551616 可支持的理论内存是绝对够人类使用了。

那在 64 位系统下,理论上 JVM 表示一个对象所在内存的地址需要 64 位来表示即 8 byte 字节,那其实大可不必🙅🏻‍♀️

8G 寻址 = 2^33 ,16G 寻址 = 2^34 ,32G 寻址 = 2^35 ,而我们大部分机器基本都在 32G 或之内,所以基本 35 位就可以表示所有内存位置了,JVM 通过算法讲其压缩到 32 位,在到 CPU 寄存器处理时在逆向解压缩出来。指针压缩就是这个道理。

Tips:默认配置下,如果堆内存大于 32G 指针压缩会失效,一般我们最大设置堆内存会设置的比 32G 小一点点,这样可以避免很多麻烦,所以堆并不是越大越好。

指针压缩和类型的对其填充有关,默认对其填充 8 byte 倍数,调高该值可以使指针压缩支持到更大。参考 为什么JVM开启指针压缩后支持的最大堆内存是32G?

对象内存分配

在给对象分配内存的时候,有两种方式

  1. 指针碰撞: 这个是默认的方式,用于规整的 JVM 内存空间进行内存分配 (比如垃圾回收算法使用的是标记整理),这种依次分配的效率是比较高的
  2. 空闲列表:当内存并不规整,而是分散使用时,就需要维护一个空闲位置的列表地址进行分配 (标记清除)

那在分配内存的时候,多线程情况下不可避免会出现抢占问题,解决方案:

  1. 线程本地缓冲 TLAB Thread Local Allocate Buffer: 即预先给每个线程分配一块空间,有些在自己分配的空间中进行分配避免争抢
  2. 比较交换 CAS Compare And Swap + 失败重试:即多个线程争抢一个位置时,先拿到的先分配,其他的失败后重试其他位置分配

上一篇:戒毒所大门对联

下一篇:欢歌什么成语

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...