JVM类加载之创建对象的过程
JVM对象的创建
new一个对象到底发生了什么?

1.VM遇到new关键字:首先检查是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否被加载,验证,准备,解析,初始化过,如果没有,必须先执行相应的类加载过程
2.类加载检查通过后,VM为新生对象分配内存,对象所需的内存空间大小在类加载完成之后便可确定,VM采用指针碰撞(内存规整:Serial,ParNew等有内存压缩功能的收集器)或空闲列表(内存不规整:CMS)的方式将一块确定大小的内存从java堆中划分出来。
指针碰撞:假设java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边。中间放着一个指针作为分界点的指示器,那所分配的内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。
空闲列表:如果java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错。虚拟机必须维护一个列表,记录那些内存块是可用的,在分配的时候从列表中找到一块足够大的内存划分给对象实例,并更新列表上的记录。
3.由于VM创建对象的行为非常频繁,因此需要考虑内存分配的并发问题解决方案:
(1)对分配内存空间的动作进行同步:用CAS失败重试的方式
(2)把内存分配的动作按照线程划分在不同的空间中进行,每个线程在java堆中预先分配一小块内存,即本地线程分配缓冲TLAB,各线程首先在TLAB上分配内存,TLAB使用完之后,分配新的TLAB时才需要同步锁定。jvm是否使用TLAB可以通过-XX:+/-UseTLAB参数指定。
4.内存分配完成之后,VM需要将分配的内存空间都初始化为零(不包括对象头),如果在TLAB上分配内存,此过程可提前至TLAB分配时进行。这一步保证了对象的实例字段可以不赋初值也可以直接使用。
5.设置对象头信息;这些信息包括该对象是那个类的实例,如何才能找到该类的元数据信息,对象的哈希码,对象的GC分代信息等
6.对于VM来说,新的对象已经创建完成;但对于java程序来说,对象创建才刚开始,因为方法还没有执行,所有的字段都还为零,所以要执行方法进行初始化。
对象在内存中是怎样存在的?
在HotSpot Vm中,对象在内存中分为三个区域:对象头,实例数据和对其填充。
对象头
对象头包括两部分:类型指针Class Metadata Address和MarkWord。
类型指针即指向它的类元数据的指针,虚拟机可以通过类型指针确定该对象属于哪个类。
MarkWord用来存储对象本身的运行时数据:哈希码,GC分代年龄,锁状态标志,线程状态标志等。这部分数据的长度在32位和64位VM分别为32bit和64bit,称之为“Mark Word”。


实例数据
存储了程序中的各种类型的字段数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度。
对齐填充
不是必需存在的,为了字节填充,仅起到占位符的作用。
怎样能准确的找到内存中的对象--对象定位
Java程序通过虚拟机栈的局部变量表中的reference来找到堆中的对象,reference可以是指向对象的直接指针,也可以是指向句柄的指针。
(1)句柄:Java堆中将会划分出一块内存作为句柄池,reference中存储对象的句柄地址,而句柄中包含了对象实例数据与类型数据的具体各自的地址信息。

(2)直接指针:reference中存储的直接就是对象地址

JVM类加载之创建对象的过程的更多相关文章
- 搞懂JVM类加载机制
有这样一道面试题: class Singleton{ private static Singleton singleton = new Singleton(); public static int v ...
- JVM类加载过程学习总结
JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...
- 【深入Java虚拟机】一 JVM类加载过程
首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...
- JVM类加载过程详细分析
双亲委派加载模型 为什么需要双亲委派加载模型 主要是为了安全,避免用户恶意加载破坏JVM正常运行的字节码文件,比如说加载一个自己写的java.util.HashMap.class.这样就有可能造成包冲 ...
- JVM -- 类加载的过程
类的加载过程? 一个Java文件从编码完成到最终执行,一般主要包括"编译"和"运行"两个过程.编译,即把我们写好的java文件,通过javac命令编译成字节码, ...
- 不止面试—jvm类加载面试题详解
面试题 带着问题学习是最高效的,本次我们将尝试回答以下问题: 什么是类的加载? 哪些情况会触发类的加载? 讲一下JVM加载一个类的过程 什么时候会为变量分配内存? JVM的类加载机制是什么? 双亲委派 ...
- java类加载、对象创建过程
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...
- JVM加载类的过程,双亲委派机制中的方法
JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载 1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...
- JVM类加载续
上一篇理解了JVM类加载过程的第一个阶段,这篇来说说剩下的阶段:验证.准备.解析.初始化.需要注意的是,这些阶段(解析除外)只是按照这个顺序开始,但是执行的过程中可能存在交叉. 验证:就是要对加载的二 ...
随机推荐
- finetune
微调的具体方法和技巧有很多种,这里总结了在不同场景下的微调技巧: 1)新数据集比较小且和原数据集相似.因为新数据集比较小(比如<5000),如果fine-tune可能会过拟合:又因为新旧数据集类 ...
- 闪回之 Flashback Query (dml表、过程、函数、包等)、Flashback version Query
Flashback Query 背景:Flashback 是 ORACLE 自 9i 就开始提供的一项特性,在 9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数 ...
- kindle3 破解字体
在万能的链接里下载kindle-fonts-4.4.N-k3.zip,update后kindle里出现linkfonts/fonts,这里就是存放字体的位置,字体格式需用.ttf. 在linkfont ...
- Python3解leetcode Same TreeBinary Tree Level Order Traversal II
问题描述: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, fro ...
- requests.session保持会话
原文地址:https://blog.csdn.net/jyh_jack/article/details/82457953 如何使用requests后登录网站后,保持Session继续实现浏览.下载等效 ...
- <正则吃饺子> :关于oracle 中 exists 、not exists 的简单使用
话不多说,简单的总结而已.网络上很多很详细介绍. 例如,博文:http://blog.csdn.net/zhiweianran/article/details/7868894 当然这篇也是转载的,原 ...
- url 传递参数(特殊字符)解决方法
url 传递参数(特殊字符)解决方法 首先设置 apache 配置文件, server.xml 在 port=8080 那一行中加上 URIEcoding=GBK 有些符号在URL中是不能直接传递的, ...
- SVN 被防火墙阻止的解决方法
SVN 被防火墙阻止的解决方法: 1. 进入WIN7的防火墙,看到有的SVN服务是被阻止的,专用的和公用的要设置为允许被防火墙阻止的解决方法" TITLE="SVN 被防火墙阻止的 ...
- hdu4366 Successor (dfs序+zkw线段树)
Successor Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- ZOJ - 4104 Sequence in the Pocket(思维+元素移至列首排序)
Sequence in the Pocket Time Limit: 1 Second Memory Limit: 65536 KB DreamGrid has just found an ...