浅谈对象的创建、内存布局和访问定位

在此简单的记录一下《深入理解Java虚拟机》第2章的2.3节内容。

对象的创建

  这里的对象的创建是指普通的对象(不包括数组和Class对象)。对象的创建简单来说就是执行new的时候,虚拟机做出对应的响应。让我们看看一下虚拟机创建对象的过程: 1.虚拟机遇到new指令时,首先尝试在常量池中定位到对应类的符号引用,并检查这个符号引用代表类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程(后续会写一下关于类加载的问题)。 2.类加载检查通过后,为新生对象分配内存。对象内存的大小在类加载完成后便可完全确定。对象内存分配有“指针碰撞”和“空闲列表”两种方法,“指针碰撞”是把已用内存放到指针的一边,未用的放到另一边,以指针分隔,当需要分配一个新对象内存时把指针往未分配内存那边移动相对应的空间即可;“空闲列表”是因为内存已用的和未用的并不是规整的,它们是交错的,所以需要一个列表记录内存块的情况。Java堆是线程之间共享的内存,虚拟机采用CAS配上失败重试的方式保证更新操作的原子性保证内存指针修改并发安全性;另一种方法是“本地线程分配缓冲(Thread Local Allocation Buffer TLAB)”。 3.将虚拟机分配到的内存空间初始化为零值。 4.对对象进行必要的设置。其实是对对象头编写。 5.完成上面4个步骤执行new指令后会接着执行方法 到此对象才算完成生产出来。

对象的内存布局

  对象在内存中存储的布局可分为3部分:对像头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

  • 对象头   对象头包括两部分信息:第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等;另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。如果对象是一个Java数组,那么对象头还必须有一块用于记录数组长度的数据。因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组大小。
  • 实例数据   实例数据部分是对象真正存储的有效信息。
  • 对象填充   因为自动内存管理系统要求对象的大小必须是8字节的整数倍,才有对象填充的说法。

对象的访问定位

  Java程序需要通过栈上的reference数据来操作堆上的具体对象。reference类型存放的是对象的引用,但是具体怎么样访问对象取决于虚拟机实现而定。目前主流的访问方式有“使用句柄”和“直接指针”两种。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陶士涵的菜地

[javaSE] 数据结构(二叉树-遍历与查找)

9520
来自专栏changxin7

4.生成器,内置函数Ⅰ

什么是生成器?这个概念比较模糊,各种文献都有不同的理解,但是核心基本相同。生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概...

7430
来自专栏陶士涵的菜地

[javaEE] jsp入门

生成一个xxx_jsp.java的Servlet文件,jsp的脚本片段放在了_jspService()方法里面

10020
来自专栏陶士涵的菜地

[javaEE] jsp的指令

jsp的指令:jsp的指令(directive)是为jsp引擎而设计的,他们并不直接产生任何可见输出,而是告诉引擎如何处理jsp

11820
来自专栏陶士涵的菜地

[javaEE] jsp的九大隐式对象

如果一个数据,除了在当前Servlet中使用,还要在请求转发中使用,使用request域

11840
来自专栏陶士涵的菜地

[javaSE] 数据结构(二叉查找树-插入节点)

二叉查找树(Binary Search Tree),又被称为二叉搜索树,它是特殊的二叉树,左子树的节点值小于右子树的节点值。

9220
来自专栏陶士涵的菜地

[javaSE] 数据结构(栈)

4810
来自专栏陶士涵的菜地

[javaSE] 数据结构(队列)

4110
来自专栏changxin7

3.Python迭代器(函数名的应用,新版格式化输出)

​ 函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值;但是作为函数名他也有特殊的功能就是加上()就会执行对应的函...

8220
来自专栏陶士涵的菜地

[javaSE] 数据结构(AVL树基本概念)

定义一个AVL树,AVLTree,定义AVLTree的节点内部类AVLNode,节点包含以下特性:

7420

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励