当前位置: 首页 > news >正文

7.jvm对象内存布局

目录

  • 概述
  • 对象里的三个区
    • 对象头
      • 验证
        • 代码
        • 控制台输出
        • 分析
      • 验证2
        • 代码
        • 控制台输出
    • 实例数据
    • 对其填充
  • 访问对象
  • 结束

概述

jvm对象内存布局详解。

相关文章在此总结如下:

文章地址
jvm基本知识地址
jvm类加载系统地址
双亲委派模型与打破双亲委派地址
运行时数据区地址
运行时数据区-字符串常量池、程序计数器、直接内存地址
jvm中对象创建流程与内存分配地址

对象里的三个区

对象里有啥?
在这里插入图片描述

对象头

对象头:8字节,如果是数组12字节(记录数组长度,占4字节)

  • 标记字段:存储对象运行时自身数据

    • 默认:对象Hashcode、GC分代年龄、锁状态
    • 存储数据结构并不是固定的
  • 类型指针:对象指向类元数据的指针

    • 开启指针压缩占4字节、不开启8字节 (jdk1.6之后默认是开启的)
  • 数组长度:如果是数组,则记录数组长度,占4个字节

  • 对其填充:保证数组(针对的是数组)的大小永远是8字节的整数倍

                        32位Markword是可变的数据结构,对象头总大小固定8字节
    

在这里插入图片描述

Markword 占4个字节,共32位。

					64位Markword是可变的数据结构,对象头总大小固定12字节

在这里插入图片描述

在这里插入图片描述

验证

打印空对象的内存而已信息

代码
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.9</version>
</dependency>

执行代码

package com.fun.info;

import org.openjdk.jol.info.ClassLayout;

public class ObjLock {
    public static void main(String[] args) {
        Object o = new Object();
        System.out.println("new Object:"+ ClassLayout.parseInstance(o).toPrintable());
    }
}
控制台输出

在这里插入图片描述

分析
  • 首先对象头是包含 Markword类型指针 这两部分信息
  • 开启指针压缩的情况下,存放 Class 指针的空间大小是4字节,Markword是8字节,对象头为12个字节
  • 新建 Object 对象,会在内存占用16个字节,其中 Header 占12个(Markword 占8个 + ClassPoint 占 4个),没有实例数据,补充对齐 4 个字节

验证2

基本数据类型和包装类的内存占用情况

数据类型内存占用 (byte)
boolean1
byte1
short1
char2
int4
float4
long8
double8
Boolean4
Byte4
Short4
Character4
Integer4
Float4
Long4
Double4
代码
package com.fun.info;

import org.openjdk.jol.info.ClassLayout;

public class ObjLock2 {
    public static void main(String[] args) {
        Student o = new Student();
        System.out.println("new Object:"+ ClassLayout.parseInstance(o).toPrintable());
        o.setAge(10);
        o.setFlag(true);
        o.setName("abc");
        System.out.println("赋值 new Object:"+ ClassLayout.parseInstance(o).toPrintable());

    }

    static class Student{
        private boolean flag;
        private int age;
        private String name;

        public boolean isFlag() {
            return flag;
        }

        public void setFlag(boolean flag) {
            this.flag = flag;
        }
        
        public void setAge(int age) {
            this.age = age;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
控制台输出

在这里插入图片描述
在这里插入图片描述

总结: 对象从创建,对象的大小就已确定了。

实例数据

对象内部的成员变量

对其填充

8字节对象,保证对象大小是8字节的整数倍。

访问对象

如何访问对象?

在这里插入图片描述
在这里插入图片描述

两种方式如上两图:

  • 1.句柄
  • 2.直接指针

结束

至此,jvm对象内存布局就说得明明白白了,如有疑问,欢迎评论区留言。

相关文章:

  • MongoDB基础知识~
  • 【Python小程序】浮点矩阵加减法
  • Window安装MongoDB
  • Python 日志记录器logging 百科全书 之 日志回滚
  • 基于python+TensorFlow+Django卷积网络算法+深度学习模型+蔬菜识别系统
  • 【Java】集合(一)单列集合List
  • Windows系统下使用docker部署redis
  • 基于php+thinkphp的网上书店购物商城系统
  • 纯手写 模态框、消息弹框、呼吸灯
  • 文本生成高精准3D模型,北京智源AI研究院等出品—3D-GPT
  • nodejs+vue+python+PHP+微信小程序-安卓- 电影在线订票系统的设计与实现-计算机毕业设计推荐
  • 【Vue 透传Attributes】
  • TensorFlow 的基本概念和使用场景
  • Ubuntu18.04 安装docker教程
  • 离线视频ocr识别
  • Django框架
  • Oracle Unifier 22.12 ~ 23.10 功能改进清单表
  • excel表的筛选后自动求和
  • 【解决问题】---- 解决 avue-crud 表格勾选数据翻页后界面保持选中
  • Springboot通过ObjectMapper(节点树)解析JSON
  • 上海交大曾小勤:科技传播不应停留于知识搬运,要做科学思维的播种机
  • 朱雀二号改进型遥二运载火箭发射成功
  • 蒲慕明院士:未来数十年不是AI取代人,而是会用AI的人取代不会用的
  • 小雨伞保险经纪母公司手回集团通过港交所聆讯
  • 《制止滥用行政权力排除、限制竞争行为规定(修订草案征求意见稿)》公开征求意见
  • 我国城市规划“全面体检”套餐出台,城市体检将逐步与供地计划等挂钩