JVM:Hotspot虚拟机中的对象
在HotSpot虚拟机中,对象在内存中存储的布局可以被分为3个区域:对象头(Header)、实例数据(Instance data)和对齐填充(Padding).对象头包括两部分信息,第一部分存储自身的运行时数据,如哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向锁ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中(未开启压缩指针)分别为32bit和64bit,官方称它为 Mark Word。
| 存储内容 | 标志位 | 状态 |
| 对象哈希码、对象分代年龄 | 01 | 未锁定 |
| 指向锁记录的指针 | 00 | 轻量级锁定 |
| 指向重量级锁的指针 | 10 | 膨胀(重量级锁定) |
| 空,不需要记录信息 | 11 | GC标记 |
| 偏向ID、偏向时间戳、对象分代年龄 | 01 | 可偏向 |
查找对象的元数据信息不一定要经过对象本身。如果对象是一个数组,对象头必须有一块记录数组长度的数据,但是从数组的元数据中却无法确定大小。
实例数据部分是对象真正存储的有效信息,也就是在程序中所定义各种类型的字段内容。无论是父类继承下来的,还是在子类中定义的。这部分会影响虚拟机分配策略参数和字段在Java源码中定义顺序的影响。
对齐填充并不是必然存在的,没有特别含义,仅仅是占位符的作用。对象的的大小必须是8字节的整数倍,示例数据没有满足8字节的倍数,则会填充补全。
对象的访问定位
建立对象是为了使用对象,Java程序需要通过栈上的reference数据来操作堆上的具体对象。reference类型是一个对象的引用,并没有规定是用何种定位、访问堆中对象的具体位置,
这些取决于虚拟机的实现。目前主流的访问方式有句柄和直接指针两种。
- 若是用句柄的话,Java堆中会划分一块内存来作为句柄池,reference中存储的是对象的句柄地址,而句柄中包含对象实例数据和对象类型数据的具体地址信息。
- 若是用直接指针(开销小,速度相对较快),那么Java堆对象就必须考虑放置访问对象类型数据的相关信息,而reference中存储的就是对象地址。
JVM:Hotspot虚拟机中的对象的更多相关文章
- JVM -- 虚拟机中的对象
一.HotSpot虚拟机 它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机.我们大致知道虚拟机内存的概况,也许更想了解这些虚拟机内存的数据的其他细节,誓如它们是如 ...
- 图解JVM在内存中申请对象及垃圾回收流程
http://longdick.iteye.com/blog/468368 先看一下JVM的内存模型: 从大的方面来讲,JVM的内存模型分为两大块: 永久区内存( Permanent space )和 ...
- HotSpot 虚拟机中对象的创建过程
- java对象在内存中的结构(HotSpot虚拟机)
一.对象的内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 从上面的这张图里面可以 ...
- JVM探究之 —— HotSpot虚拟机对象探秘
本节以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1. 对象的创建 Java是一门面向对象的编程语言.在语言层面 ...
- 深入理解JVM:HotSpot虚拟机对象探秘
对象的创建 java是一门面向对象的语言.在Java程序执行过程中无时无刻有Java对象被创建出来.在语言层面上,创建对象(克隆.反序列化)一般是一个newkeyword而已,而在虚拟机中,对象的创建 ...
- JVM学习十三 - (复习)HotSpot 虚拟机对象探秘
对象的内存布局 在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding) 对象头 对象头记录了对象 ...
- HotSpot 虚拟机对象揭秘【转载】
对象的创建 Java 对象的创建过程, ①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解 ...
- jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解
一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤. 二.类加载时机: 1 ...
随机推荐
- Docker安装Nginx(含:Windows启动、重启、停止)
Docker安装Nginx #docker pull nginx:latest (第一次启动Docker-Nginx) #docker run --detach \ --publish 80:80 \ ...
- 什么是 baseline 和 benchmark
baseline 一个算法被称为 baseline 算法说明这个比目前这个算法还差的已经不能接受了,方法有革命性的创新点可以挖掘,且存在巨大提升空间和超越benchmark的潜力,只是由于发展初期导致 ...
- DEDECMS首页循环调用一级栏目和二级栏目的实现方法
调用方法: {dede:channelartlist typeid='2'} <li class="First"><a href="{dede:fiel ...
- Docker系列(24)- 实战:DockerFile制作tomcat镜像
实战:DockerFile制作tomcat镜像 step-1 准备镜像文件 tomcat压缩包,jdk压缩包! step-2 编写dockerfile文件,官方命名Dockerfile,build会自 ...
- 事项同步事项编码(mt_code)长度超过数据库限制的varchar(32)线上问题
改下长度限制重新同步下,可以恢复正常!
- CF346E-Doodle Jump【类欧】
正题 题目链接:https://www.luogu.com.cn/problem/CF346E 题目大意 给出\(a,n,p,h\),在每个\(ax\%p(x\in[0,n])\)的位置有一个关键点, ...
- P1251-餐巾计划问题【费用流】
正题 题目链接:https://www.luogu.com.cn/problem/P1251 题目大意 \(N\)天,第\(i\)天需要\(a_i\)个餐巾. 每个餐巾价格为\(p\),使用完后有两种 ...
- Anaconda和canda简介及区别
Anaconda简介: 1.是一个开源的Python发行版本,其包含了conda.Python等软件包,numpy,pandas(数据分析),scipy等科学计算包,而无需再单独下载配置. 可以在同一 ...
- Dapr + .NET Core实战(十-终篇)K8S运行Dapr
工作原理 为了实现在k8s上安装Dapr,Dapr需要部署dapr-sidecar-injector.dapr-operator.dapr-placement和dapr-sentry服务. dapr- ...
- The art of multipropcessor programming 读书笔记-硬件基础2
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...