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. zk 09之:Curator之二:Path Cache监控zookeeper的node和path的状态

    在实际应用开发中,当某个ZNode发生变化后我们需要得到通知并做一些后续处理,Curator Recipes提供了Path Cache 来帮助我们轻松实现watch ZNode. Path Cache ...

  2. 12 Vue学习 项目技术栈

    vue2 + vuex + vue-router + webpack + ES6/7 + less + element-ui 1:vuex: Vuex 是一个专为 Vue.js 应用程序开发的状态管理 ...

  3. Redis 教程笔记

    简介: 开源BSD.key-value数据库.数据持久化(可将内存数据保存到磁盘中),提供多种数据结构. 支持数据备份(master-slave模式) 优势: 性能高.数据类型丰富.原子性.其他 Re ...

  4. 浅谈HTML移动Web开发(转)

    一.响应式Web设计 PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能征服显示的固定宽度居中显示,后者则采用百分百. 响应式布局意味着媒体查询,响应式web设计并非新的技术, ...

  5. Attribute meta-data#android.support.VERSION@value value=(25.4.0) from AndroidManifest.xml:25:13-35 is also present at AndroidManifest.xml:28:13-35 value=(26.1.0).

    Android Studio 编译项目的时候报错 Merging Errors: Error: Attribute meta-data#android.support.VERSION@value va ...

  6. ]Linq to EF 增删改查

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  7. 快速发现并解决maven依赖传递冲突

    此文已由作者翟曜授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近在测试过程中,遇到了几次maven传递依赖冲突的问题,所以记录下解决的过程,遇到类似问题供参照. 问题现象 ...

  8. Vue Study [1]: Vue Setup

    Description The article for vue.js Setup. Original post link:https://www.cnblogs.com/markjiang7m2/p/ ...

  9. C++ com

    http://www.cnblogs.com/hlxs/p/3783920.html 昨天看了<COM本质论>的第一章"COM是一个更好的C++",觉得很有必要做一些笔 ...

  10. 蓝桥杯T126(xjb&大数开方)

    题目链接:http://lx.lanqiao.cn/problem.page?gpid=T126 题意:中文题诶- 思路:显然被翻转了奇数次的硬币为反面朝上,但是本题的数据量很大,所以O(n^2)枚举 ...