JVM-JVM中对象的结构

这篇具有很好参考价值的文章主要介绍了JVM-JVM中对象的结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对象内存布局

JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构

对象里的三个区:

  1. 对象头(Header):Java对象头占8byte。如果是数组则占12byte。因为JVM里数组size需要使用4byte存储。
    标记字段MarkWord:
    用于存储对象自身的运行时数据,它是synchronized实现轻量级锁和偏向锁的关键。
    默认存储:对象HashCode、GC分代年龄、锁状态等等信息。
    为了节省空间,也会随着锁标志位的变化,存储数据发生变化。
    标记字段的结构:
    JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构
    类型指针KlassPoint:
    是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
    开启指针压缩存储空间4byte,不开启8byte。
    JDK1.6+默认开启
    数组长度 如果对象是数组,则记录数组长度,占4个byte,如果对象不是数组则不存在。
    对齐填 保证数组的大小永远是8byte的整数倍。

  2. 实例数据(Instance Data):生成对象的时候,对象的非静态成员变量也会存入堆空间

  3. 对齐填充(Padding):JVM内对象都采用8byte对齐,不够8byte的会自动补齐。

案例1:

<dependency>
	<groupId>org.openjdk.jol</groupId>
	<artifactId>jol-core</artifactId>
	<version>0.9</version>
</dependency>
 Object o = new Object();
        System.out.println("new Object:" +
                ClassLayout.parseInstance(o).toPrintable());

JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构
注:首先对象头是包含MarkWord和类型指针这两部分信息的;
开启指针压缩的情况下,存放Class指针的空间大小是4字节,MarkWord是8字节,对象头为12字节;
新建Object对象,会在内存占用16个字节,其中Header占12个(MarkWord占8个+KlassPoint占4个),没有实例数据,补充对齐4个。
结论:对象大小 = 对象头12 + 实例数据0 + 对齐填充4 = 16 bytes
JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构
案例2:

public class TT {
    public static void main(String[] args) {
        Hero a = new Hero();
        System.out.println("new A:" +
                ClassLayout.parseInstance(a).
                        toPrintable());
        Hero b = new Hero(1, true, "test");
        System.out.println("赋值后:" +
                ClassLayout.parseInstance(b).
                        toPrintable());
    }

    static class Hero {
        int i;
        boolean flag;
        String str;

        public Hero() {

        }

        public Hero(int i, boolean flag, String str) {
            this.i = i;
            this.flag = flag;
            this.str = str;
        }
    }
}

JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构
对象的大小 = 12对象头 + 4*3的实例数据 + 0的填充 = 24bytes

对象头存储信息分析

1 如果是空对象

 Object obj = new Object();

JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构
2 带锁的对象
可以看一下这篇文章关于头的顺序

  • 偏向锁
// java 默认5s以上才会开启偏向锁
Thread.sleep(5001);
Object lock = new Object();
printObj(lock, 1);
synchronized (lock) {
    printObj(lock, 2);
}

JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构

  • 轻量级锁
Thread.sleep(5001);
   Object lock = new Object();
   printObj(lock, 1);
   synchronized (lock) {
       printObj(lock, 2);
   }
   Thread.sleep(1000);
   new Thread(() -> {
       synchronized (lock) {
           System.out.println("get lock one");
           printObj(lock, 3);
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               throw new RuntimeException(e);
           }
       }
   }).start();

这里我们有Main线程和新开的一个线程来竞争资源,所以就会升级为一个轻量级锁。
JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构

  • 重量级锁
for (int i = 0; i < 10; i ++) {
 new Thread(() -> {
     synchronized (lock) {
         try {
             Thread.sleep(1000);
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
         System.out.println("get lock three");
     }
 }).start();
  printObj(lock, 5);

JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构

对象的访问

有两种方式:

  1. 句柄:稳定,对象被移动只要修改句柄中的地址
    JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构

  2. 直接指针:访问速度快,节省了一次指针定位的开销
    JVM-JVM中对象的结构,JVM虚拟机,jvm,对象头,对齐,对象结构
    对象类型数据存储的是对象的元信息,比如有哪些字段,那些方法文章来源地址https://www.toymoban.com/news/detail-829893.html

到了这里,关于JVM-JVM中对象的结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java虚拟机快速入门 | JVM引言、JVM内存结构、直接内存

    目录 一:JVM引言 1. 什么是 JVM ? 2. 常见的 JVM 3. 学习路线 二:JVM内存结构 1. 程 序 计 数 器(PC Register) 2. 虚 拟 机 栈(JVM Stacks) 3. 本 地 方 法 栈(Native Method Stacks) 4. 堆(Heap) 5. 方 法 区(Method Area) 三:直接内存 tips: 首先给大家推荐两款好用的免费软件:动图抓取软

    2024年02月05日
    浏览(53)
  • “深入探究JVM内部结构与工作原理:解析Java虚拟机“

    标题:深入探究JVM内部结构与工作原理 摘要:本文将深入探究Java虚拟机(JVM)的内部结构与工作原理。我们将介绍JVM的基本组成部分,包括类加载器、运行时数据区和执行引擎。同时,我们将通过一个示例代码来说明JVM内部结构与工作原理的具体应用。 介绍: Java虚拟机(

    2024年02月12日
    浏览(26)
  • “深入解析JVM内部结构与工作原理:揭秘Java虚拟机的奥秘“

    标题:深入解析JVM内部结构与工作原理:揭秘Java虚拟机的奥秘 摘要:本文将深入探讨Java虚拟机(JVM)的内部结构和工作原理,帮助开发者更好地理解JVM的运行机制,从而提高Java程序的性能和稳定性。 正文: 一、JVM概述 Java虚拟机(Java Virtual Machine)是Java程序的运行环境,

    2024年02月11日
    浏览(37)
  • java面经03-虚拟机篇-jvm内存结构&垃圾回收、内存溢出&类加载、引用&悲观锁&HashTable、引用&finalize

    要求 掌握 JVM 内存结构划分 尤其要知道方法区、永久代、元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码 执行 java 命令 创建 JVM,调用类加载子系统加载 class,将类的信息存入 方法区 创建 main 线程,使用的内存区域是 JVM 虚拟机栈 ,

    2024年02月09日
    浏览(40)
  • Jvm对象回收算法-JVM(九)

    上篇文章介绍了jvm运行时候对象进入老年代的场景,以及如何避免频繁fullGC。 Jvm参数设置-JVM(八) 老年代分配担保机制 这个机制的目的是为了提升效率,在minorGC之前,会有三次判断,之后再次minorGC速度会很快。 老年代剩余空间是否 大于 年轻代里现在所有对象 大于的话则

    2024年02月13日
    浏览(42)
  • JVM 虚拟机 ---> JVM 基础概念

    一、Java 跨平台 Java是一种 可跨平台 的编程语言,我们通常把 CPU 处理器与操作系统构成的计算机系统整体成为叫 平台 不同的 CPU ,差异主要在底层指令集不同,指令集分为精简指令集( RISC )和复杂指令集( CISC )。每个 CPU 都有自己的特定指令集 **指令集:**是CPU中用来计

    2024年02月09日
    浏览(32)
  • Jvm创建对象之内存分配-JVM(七)

    上篇文章介绍了jvm创建,会校验是否已加载类,没有则加载,通过之前学的源码,classLoader加载完之后,虚拟机开始给类分配内存,指针移动分配和free链表分配,解决并发分配情况用cap和TLAB方法。之后设置对象头部信息,有mark word线程锁,分代年龄等,klass pointer。还有指针

    2024年02月13日
    浏览(57)
  • JVM系列(六) JVM 对象终结方法finalize

    我们有几个特别容易混淆的final、finally、finalize, 他们之间的区别是什么? final 是java finally 是try-catch-finally finalize 是Object 根类的方法 今天我们着重讲下 finalize方法 1.finalize方法的原理及调用 finalize方法也是Java中所有类中必有的方法,因为它是属于Object根类的方

    2023年04月08日
    浏览(28)
  • JVM---理解jvm之对象已死怎么判断?

    目录 引用计数算法 什么是引用 可达性分析算法(用的最多的) 定义:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 但是不能解决循环引用的问题,A引用

    2024年02月12日
    浏览(31)
  • JVM(Java虚拟机)-史上最全、最详细JVM笔记

    一、JVM概述 1、1为什么要学习JVM 1、2虚拟机 1、3JVM作用 1、4JVM整体组成部分  二、JVM结构--类加载器 2、1类加载子系统 2、2类加载过程 2、2、1加载 2、2、2链接 2、2、3初始化 2、3类加载器分类 2.3.1 引导类加载器(启动类加载器 BootStrap ClassLoader) 2.3.2 扩展类加载器(Extension ClassL

    2024年02月03日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包