一、对象创建的过程:当虚拟机遇到一条含有New的指令时,会进行一系列对象创建的操作。

  1. 检查常量池中是否含有带创建对象所属类的符号引用

    a) 如果含有的话,直接进行下一步

    b) 如果常量池中没有这个符号引用的话,说明这个类还没有被定义,回报ClassNotFounddError的异常。

  2.检查该符号引用所属的类是否已经被加载到JVM中

    a)  如果已经被加载到JVM中,则直接进行下一步

    b)如果这个符号引用所属的类还没有被加载到JVM中,则会先找到这个类的Class文件,把它加载到方法区。

  3.根据方法区中该类的信息确定创建该类的对象需要的空间大小。

  4.在堆内存中为该对象分配内存空间。

    a)   分配内存空间的方法主要有两种:指针碰撞和空闲列表。

    b) JVM选用哪一种内存分配方法主要取决于该虚拟机使用哪一种垃圾收集器。

    c) 指针碰撞法主要适用于复制法和标记-整理法

    d) 空闲列表法主要适用于标记-清理法

  5.为该对象的成员变量进行初始化

  6.设置对象头信息

  7.调用该对象的构造方法进行初始化

至此,对象在虚拟机中的创建过程就已经完成了。

二、对象的内存模型

  1. 对象头:主要包括对象在运行过程中需要的信息,可能还会包括类型指针(用于指示对象是属于哪一个类);如果对象是一个数组的话,对象头中还会包括数组的长度。
  2. 实例数据:该对象的成员变量的值
  3. 补充对齐:为了保证创建对象的长度是8个字节长度的倍数。主要是因为对象头虽然一定是8字节的整数倍,但是实例数据部分的长度是不确定的。

三、访问对象的过程

  1. 引用类型的变量中存放的是一个地址,根据地址类型的不同,对象有不同的类型访问方式。
  2. 句柄访问方式:在堆内存空间中有一个句柄池,里边存放的是对象在内存中的地址和对象所属类信息。这种情况下的引用类型的变量中存放的是对象在句柄池中的地址,通过句柄池中的地址然后才能访问到该对象。
  3. 直接访问方式:引用类型的变量中存放的就是该对象在内存的实际地址,这样通过应用类型的变量能够直接访问到该对象。但是需要在该类所在的内存空间中增加额外的策略储存该对象所属类的类信息的地址。
  4. 两者的比较:HotSpot采用直接指针方式访问对象,因为它只需一次寻址操作,从而性能比句柄访问方式快一倍。但它需要额外的策略存储对象在方法区中类信息的地址。

深入理解JVM(2)——揭开HotSpot对象创建的奥秘的更多相关文章

  1. 深入理解Java虚拟机(二)——HotSpot对象创建、内存、访问

    对象的创建 虚拟机遇到一条字节码new指令时,开始对象创建过程. 首先去检查这个指令的参数是否能在常量池定位到一个类的符号引用: 检查这个符号引用代表的类是否已被加载.解析和初始化,如果没有就必须执行 ...

  2. 【深入理解JVM】:Java对象的创建、内存布局、访问定位

    对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...

  3. 深入理解JVM(③)判断对象是否还健在?

    前言 因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些 ...

  4. 深入理解JVM(4)——对象内存的分配策略

    一.Java所承担的自动内存管理主要是针对对象内存的分配和回收. 二.在Java虚拟机的五块内存空间中,程序计数器.Java虚拟机栈.本地方法栈内存的分配和回收都具有确定性,一般在编译阶段就能确定需要 ...

  5. 深入理解JVM:HotSpot虚拟机对象探秘

    对象的创建 java是一门面向对象的语言.在Java程序执行过程中无时无刻有Java对象被创建出来.在语言层面上,创建对象(克隆.反序列化)一般是一个newkeyword而已,而在虚拟机中,对象的创建 ...

  6. 深入理解JVM(③)——之HotSpot虚拟机对象探秘

    前言 上篇文章介绍了Java虚拟机的运行时数据区域,大致明白了Java虚拟机内存模型的概况,下面就基于实用优先的原则,以最常用的虚拟机HotSpot和最常用的内存区域Java堆为例,升入探讨一下Hot ...

  7. 深入理解JVM(二)--对象的创建

    Java是一门面向对象的语言,在Java程序运行的过程中,无时无刻都会有对象被创建出来,在程序语言中,创建对象(例如克隆,反序列化)通常仅仅是一个new关键字,但是在虚拟机中是怎样的呢?本文主要了解一 ...

  8. 深入探究JVM之对象创建及分配策略

    @ 目录 前言 正文 一.对象的创建方式 二.对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三.对象的访问定位 四.判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五.对象的分 ...

  9. 读书笔记jvm探秘之二: 对象创建

    对象是面向对象设计语言无法回避的东西,可见其重要性,JAVA的对象相较于C++来说,不算很复杂,但是我们看到一句话背后往往有很多东西值得探讨(NEW关键字). 对象如何被创建? 首先一句简单的NEW语 ...

随机推荐

  1. oracle安装过程中先决条件检查失败的解决办法

    1:公司数据库开始用的mysql,因为公司做的是保密性项目,所以就在项目日志过多的时候项目有爆炸的迹象啊(3000千万数据,貌似mysql有点撑不住).然后组长开始让我安装oracle,公司的内网也是 ...

  2. Pytorch LSTM 词性判断

    首先,我们定义好一个LSTM网络,然后给出一个句子,每个句子都有很多个词构成,每个词可以用一个词向量表示,这样一句话就可以形成一个序列,我们将这个序列依次传入LSTM,然后就可以得到与序列等长的输出, ...

  3. Spring MVC 注解

    概述   Spring MVC是一个采用依赖注入的思想编写.对象的依赖注入Bean的方式可以通过Spring XML里面配置,配置之后的Bean使用时候,无需使用New关键字建立对象.但是如果所有的B ...

  4. 「BZOJ3791」作业

    题解: 比正解的做法要复杂 正解直接确定了最多有2k-1段 并且可以证明2k-1是一定可以覆盖的 于是可以直接dp 我的想法是先覆盖一段黑的,然后白的覆盖上去 所以f[i][0/1/2][0/1/2] ...

  5. 移动端1px问题

    .component-confirm__buttons { border-top: 1px solid #eceef0; box-shadow: 0 1px 1px #fff; } 造成边框变粗的原因 ...

  6. 009 spring boot中文件的上传与下载

    一:任务 1.任务 文件的上传 文件的下载 二:文件的上传 1.新建一个对象 FileInfo.java package com.cao.dto; public class FileInfo { pr ...

  7. 002 Hello Spring Security

    在前面已经搭建过环境框架,现在在demo模块下写一个简单的案例,让整个环境跑起来. 一:启动Demo项目 1.新建类 在这前,先建立包. 2.启动类程序 package com.cao; import ...

  8. 2501 矩阵距离 (bfs)

    描述 给定一个N行M列的01矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i-k|+|j-l| 输出一个N行M列的整数矩阵B,其 ...

  9. python 条件与循环

    一.if语句   1.1 功能 计算机又被称作电脑,意指计算机可以像人脑一样,根据周围环境条件(即expession)的变化做出不同的反应(即执行代码) if语句就是来控制计算机实现这一功能   1. ...

  10. 2017-9-10-Vim使用说明

    首先,很多linux发行版直接进入的是vi,不是vim,刚开始使用vi会有点蒙,需要改一下配置文件到vim:"打开vi编辑器,输入i,左下角没有出现-INSERT-字样,且编辑模式跟vim不 ...