JVM系列2:HotSpot虚拟机对象
1.对象创建过程:
 
①.类加载检查:当java虚拟机遇到一条new指令时,首先会去检查该指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析、初始化过,如果没有,则必须先执行相应的类加载过程。
②.分配内存:类加载检查完成后,虚拟机将为新对象分配内存空间,且对象所需内存空间大小在其完成类加载检查后即可确定,该过程其实就是在堆中划分一小部分的确定大小的空间,用于存储对象信息。其中分配方式有以下两种:

内存分配的并发问题:
在创建对象时存在线程安全问题,虚拟机采用两种方式来保证创建对象的线程安全:
- CAS锁+失败重试:CAS是乐观锁的一种实现形式,虚拟机采用CAS+失败重试来保证更新操作的原子性。
 - TLAB:为每一个线程预先在Eden区分配一块儿内存,JVM在给线程中的对象分配内存时,首先在TLAB分配,当对象大于TLAB中的剩余内存或TLAB的内存已用尽时,再采用上述的CAS进行内存分配。
 
乐观锁:乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止
③.初始化零值:内存分配完毕后,虚拟机将该对象分配得到的内存空间全部设置初始值零(不包含对象头部分),该操作可以保证对象的实例字段在代码中即使不赋予初始值就可以直接使用。程序能访问到这些字段的数据类型所对应的零值。
④.设置对象头:初始化零值完成后,虚拟机将对象的一些必要信息存放在对象头中,这些信息包括:例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希吗、对象的 GC 分代年龄等信息。另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。
⑤.执行Init方法:完成上述操作后,java虚拟机即完成了一个对象的创建,但是对于java程序而言,对于该对象的一些定制的内容还未进行,<init>方法中包含了程序员的定制需求和意愿,执行完init方法后,对象完成了初始化,此时才是一个可用对象。
2.对象的内存布局
虚拟机中,对象在内存中的存储包括三个部分:对象头、实例数据和对齐填充。
Hotspot虚拟机的对象头:包括两部分信息,第一部分用于存储对象自身的自身运行时数据(哈希吗、GC分代年龄、锁状态标志等等),另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
实例数据部分:是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。
对齐填充部分:不是必然存在的,也没有什么特别的含义,仅仅起占位作用。 因为Hotspot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(1倍或2倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
3.对象的访问定位
Java程序通过java栈上的 reference 数据来操作堆上的具体对象。对象的访问方式有虚拟机实现而定,目前主流的访问方式有①使用句柄和②直接指针两种:
①.使用句柄:使用句柄访问会在java堆中开辟一片区域作为句柄池,栈中的reference中存储的就是对象的句柄地址,而句柄中则包含了对象实例数据和类型数据的地址信息。
  
在java栈中的reference中,包含了需要引用的对象的句柄地址,然后通过句柄地址在句柄池中找到指向对象实例数据和对象类型数据的指针,从而实现引用该对象。
优点:引用中存储的是句柄地址,在对象被移动(垃圾回收时对象移动时很常见的)时,只需要改变句柄中的实例数据指针,而引用中存储的句柄地址无需改变
缺点:因为引用对象通过两次指针定位,速度较直接指针访问慢
②.直接指针:使用直接指针访问时,reference中存储的是对象地址:

优点:节省了一次指针定位的操作,速度较快。
JVM系列2:HotSpot虚拟机对象的更多相关文章
- JVM探究之 —— HotSpot虚拟机对象探秘
		
本节以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1. 对象的创建 Java是一门面向对象的编程语言.在语言层面 ...
 - 深入理解JVM(③)——之HotSpot虚拟机对象探秘
		
前言 上篇文章介绍了Java虚拟机的运行时数据区域,大致明白了Java虚拟机内存模型的概况,下面就基于实用优先的原则,以最常用的虚拟机HotSpot和最常用的内存区域Java堆为例,升入探讨一下Hot ...
 - HotSpot虚拟机对象相关内容
		
一.对象的创建 1.类加载检查 普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化 ...
 - 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
		
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE? Java技术体系包括: · Java程序设计语言: · 各种硬件平台上的 ...
 - 深入理解JVM:HotSpot虚拟机对象探秘
		
对象的创建 java是一门面向对象的语言.在Java程序执行过程中无时无刻有Java对象被创建出来.在语言层面上,创建对象(克隆.反序列化)一般是一个newkeyword而已,而在虚拟机中,对象的创建 ...
 - Java虚拟机系列(二)---HotSpot虚拟机对象
		
都知道Java是一门面向对象的编程语言,在Java程序运行过程中,无时无刻不在创建对象,所以这节来总结一下HotSpot虚拟机中的Java对象. 一.Java虚拟机对象的创建过程. 在语义层面创建一个 ...
 - JVM学习十三 - (复习)HotSpot 虚拟机对象探秘
		
对象的内存布局 在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding) 对象头 对象头记录了对象 ...
 - HotSpot 虚拟机对象揭秘【转载】
		
对象的创建 Java 对象的创建过程, ①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解 ...
 - JVM系列八(虚拟机性能监控命令).
		
jps JVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程.显示信息包括虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual M ...
 
随机推荐
- java 关于数字取小数点后两位出现整数0没有的问题
			
最近再项目中对取到的一系列带很长小数的数字,展现时要求去小数点后两位显示就可以了 开始我是以下写法: double a = 0.1234455; DecimalFormat decimalForm ...
 - cookie和session的详解和区别
			
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
 - dedecms 调用所属栏目的二级栏目列表
			
include\taglib\channel.lib.php 在 else if($type=='self') { if($reid==0) return ''; $sql = "SELEC ...
 - MySQL 中 EXISTS 的用法
			
在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b create table a ( a_id int, a_name varchar( ...
 - HTML5 App的代码注入攻击
			
原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技 ...
 - 并查集+优先队列+启发式合并 || 罗马游戏 || BZOJ 1455 || Luogu p2713
			
题面:P2713 罗马游戏 题解: 超级大水题啊,特别水.. 并查集维护每个人在哪个团里,优先队列维护每个团最低分和最低分是哪位,然后每次判断一下哪些人死了,随便写写就行 并查集在Merge时可以用启 ...
 - ELK是什么?
			
ELK = ElasticSearch + Logstash + Kibana Elasticsearch:后台分布式存储以及全文检索 Logstash : 日志加工.“搬运工” Kibana : ...
 - JavaScript入门学习之一——初级语法
			
JavaScript是前端编辑的一种编程语言(不同于html,html是一种标记语言),所以和其他的编程语言一样,我们将会从下面几点学习 基础语法 数据类型 函数 面向对象 JavaScript的组成 ...
 - Hihocoder1046K个串(线段树)(待解决)
			
描述 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想知道,在这个数字序列所有连续 ...
 - poj1015 Jury Compromise[背包]
			
每一件物品有两个属性.朴素思想是把这两种属性都设计到状态里,但空间爆炸.又因为这两个属性相互间存在制约关系(差的绝对值最小),不妨把答案设计入状态中,设$f[i][j]$选$i$个人,两者之差$j$. ...