Java对象(创建过程、内存布局、访问方法)
(Java 普通对象。不包括数组、Class 对象等。)
对象创建过程
类加载
遇到 new 指令时,获取对应的符号引用,并检查该符号引用代表的类是否已被初始化。如果没有就进行类加载。
分配内存
从堆中找到一块空间划分给对象。
分配时,为了避免并发问题,JVM 会通过 CAS + TLAB 来保证线程安全。
TLAB 本地线程分配缓冲
每个线程都会在堆中预先分配一小块内存,这块空间叫做 TLAB。
线程每次给对象分配内存,就从它的 TLAB 中划分。用完会再给线程分配新的 TLAB。
只有分配 TLAB 时才需要同步锁定。
设置零值
设置实例字段的数据类型所对应的零值。
设置对象头信息
对象的哈希码、GC 分代年龄等。
执行 init 方法
new 指令后会有 invokespecial 指令,它会执行类的 <init> 方法。
该方法是编译期由构造代码块+构造方法来生成的。
对象结构
Hotspot 中对象在内存中的布局分为三个部分:
对象头
Mark Word
对象运行时数据,如哈希码、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。
类型指针
指向方法区里的类元数据。用来确定该对象是哪个类的。
实例数据
程序中定义的各字段。包括从父类继承的。
对齐填充
Hotspot 要求对象起始地址必须是 8 字节的整数倍,所以没有对齐时需要对齐填充。
如何访问对象、判断类型
JVM 规范中只规定了栈上的 reference 类型是指向对象的引用,并没有规定 JVM 该如何根据这个引用进行定位、访问堆中的对象。
Hotspot 中 reference 是直接存储了对象的地址。而获取对象类型信息,就根据对象头的类型指针来访问获取。
Java对象(创建过程、内存布局、访问方法)的更多相关文章
- 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式
		
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...
 - HotSpot Java对象创建,内存布局以及访问方式
		
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...
 - 深入理解Java虚拟机(二)——HotSpot对象创建、内存、访问
		
对象的创建 虚拟机遇到一条字节码new指令时,开始对象创建过程. 首先去检查这个指令的参数是否能在常量池定位到一个类的符号引用: 检查这个符号引用代表的类是否已被加载.解析和初始化,如果没有就必须执行 ...
 - 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位
		
参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...
 - Java对象创建过程补遗
		
一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...
 - java对象创建过程
		
1.jvm找到class文件路径. 2.jvm载入class文件,静态初始化,创建一个class对象. 3.为即将创建的对象分配内存空间. 4.对分配的空间进行清零,例如:int清除为0,boolea ...
 - java对象创建过程简介
		
这是看书的记录,字有点丑啊还是将就搬上来 -.-,等把后面看了完善图
 - 4种方法教你如何查看java对象所占内存大小
		
摘要:本文讲述4种查看java对象所占内存大小的方法 本文分享自华为云社区<查看java对象所占内存大小>,作者:xiewenci. 计算java对象所占内存大小 1.使用jdk8自带AP ...
 - 如何计算Java对象所占内存的大小
		
[ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖: <dependency> <groupId ...
 - Java中对象创建过程
		
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
 
随机推荐
- HBase2.0 meta信息丢失的修复方法
			
在HBase入库日志中发现有一个表入库失败,检查HBase服务端后发现该表的meta信息丢失了: 而HDFS上的region还在: 而HBCK工具不支持HBase2.0版本,只好自己写一个修复工具.网 ...
 - Mybatis插件扩展以及与Spring整合原理
			
@ 目录 前言 正文 插件扩展 1. Interceptor核心实现原理 2. Mybatis的拦截增强 Mybatis与Spring整合原理 1. SqlSessionFactory的创建 2. 扫 ...
 - 小书MybatisPlus第3篇-自定义SQL
			
本文档为一个系列,前面章节: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 书接上回,虽然Mybatis Plu ...
 - C#根据反射动态创建ShowDoc接口文本信息
			
我目前每天主要工作以开发api为主,这都离不开接口文档.如果远程对接的话前端总说Swagger不清晰,只能重新找一下新的接口文档.ShowDoc就是一个不错的选择,简洁.大方.灵活部署. 但是话说回来 ...
 - git和github连接权限(这是一个简便方法,不是很安全,建议大家还是用ssh解决)
			
在使用,git从github上clone下来代码后. 我们再工作区进行编辑,然后提交. 最后我们想要将我们的改变推送到github上. 但是往往这个时候,我们可能会面临这样的问题. 我们没有权限将代码 ...
 - SpingBoot整合jxls2.0-excel导出—— 列表循环,自定义方法,超链接等
			
Java中实现excel导出数据的方法有很多,一般简单的可以通过操作POI进行,但是复杂的excel格式导出如果用POI就显得非常麻烦,本文介绍的jxls2.0完全依据模板进行导出,只需要进行简单的配 ...
 - Python Ethical Hacking - KEYLOGGER(1)
			
A program that records keys pressed on the keyboard. Common features: Store logs locally(local keylo ...
 - 通过Vue实现的todolist
			
和接口对接的todolist因为有后台的存在,todolist获取的数据会一直存在不丢失(不管你如何刷新页面),思路如下: 首先得先搞到接口: 通过这个接口地址可以获取整段的数据,成功err为0. 于 ...
 - JavaScript动画实例:沿五角星形线摆动的小圆
			
五角星形线的笛卡尔坐标方程式可设为: r=10+(3*sin(θ*2.5))^2 x=r*cos(θ) y=r*sin(θ) (0≤θ≤2π) 根据这个曲线方程,在[0,2 ...
 - kubernetes+Azure DevOps实现.Net Core项目的自动化部署&均衡负载
			
1. 前言 2. Net Core项目本身的准备 2.1 dockerfile 2.2 创建kubernetes用于helm的chart包 2.2.1 说明 2.2.2 chart文件目录和文件组成 ...