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类加载之创建对象的过程的更多相关文章

  1. 搞懂JVM类加载机制

    有这样一道面试题: class Singleton{ private static Singleton singleton = new Singleton(); public static int v ...

  2. JVM类加载过程学习总结

    JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...

  3. 【深入Java虚拟机】一 JVM类加载过程

    首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...

  4. JVM类加载过程详细分析

    双亲委派加载模型 为什么需要双亲委派加载模型 主要是为了安全,避免用户恶意加载破坏JVM正常运行的字节码文件,比如说加载一个自己写的java.util.HashMap.class.这样就有可能造成包冲 ...

  5. JVM -- 类加载的过程

    类的加载过程? 一个Java文件从编码完成到最终执行,一般主要包括"编译"和"运行"两个过程.编译,即把我们写好的java文件,通过javac命令编译成字节码, ...

  6. 不止面试—jvm类加载面试题详解

    面试题 带着问题学习是最高效的,本次我们将尝试回答以下问题: 什么是类的加载? 哪些情况会触发类的加载? 讲一下JVM加载一个类的过程 什么时候会为变量分配内存? JVM的类加载机制是什么? 双亲委派 ...

  7. java类加载、对象创建过程

    类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...

  8. JVM加载类的过程,双亲委派机制中的方法

    JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载  1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...

  9. JVM类加载续

    上一篇理解了JVM类加载过程的第一个阶段,这篇来说说剩下的阶段:验证.准备.解析.初始化.需要注意的是,这些阶段(解析除外)只是按照这个顺序开始,但是执行的过程中可能存在交叉. 验证:就是要对加载的二 ...

随机推荐

  1. Oracle字符串截断

    字段.SUBSTR(string,start_position,[length]) 求子字符串,返回字符串解释:string 元字符串, start_position 开始位置(从0开始), leng ...

  2. DS:目录

    ylbtech-DS:目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cn ...

  3. ssh无密码登录设置失败的 解决办法

    因为要安装hadoop所以需要设置ssh无密码登录,SSH的安装就不在这里介绍了: 我的系统是ubuntu15.10,开始按照网上很多的步骤去配置,最后发现登录时还要密码,登录多次也是这样的情况 最后 ...

  4. Windows下怎样安装Tomcat

    Tomcat 是开源的WEB应用容器,所以受到各位程序员和公司的亲赖.在这里给大家介绍一下如何在Windows环境下安装Tomcat绿色版本,希望能够对大家有帮助. 1.首先去Tomcat官网下载To ...

  5. POJ 2976 Dropping tests (二分+贪心)

    题意:给定 n 个分数,然后让你去年 m 个分数,使得把剩下的所有的分子和分母都相加的分数最大. 析:这个题并不是分子越大最后结果就越大,也不是整个分数越大,最后结果就越大的,我们可以反过来理解,要去 ...

  6. 数据库路由中间件MyCat - 使用篇(2)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 基本概念 3. 分片 3.1 分片节点(dataNode) 表被水平切分后,每个分片表所在的数据库就是一个分 ...

  7. 30个Python物联网小实验3:使用按钮开灯关灯

    使用按钮开灯关灯 接线图非常简单,LED接GPIO17号口,按钮接GPIO2号口,负极接GND地线. 代码也非常简单: from gpiozero import LED, Button from si ...

  8. 洛谷P2854 [USACO06DEC]牛的过山车Cow Roller Coaster

    P2854 [USACO06DEC]牛的过山车Cow Roller Coaster 题目描述 The cows are building a roller coaster! They want you ...

  9. 剑指Offer的学习笔记(C#篇)-- 树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 一 . 二叉树的概念         树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可 ...

  10. 剑指Offer的学习笔记(C#篇)-- 反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...