这一节我们来讨论一下JVM对象建立过程。

JVM对象探秘

对象的建立

对象的建立过程 
 
              图一:对象建立过程 
1、类加载检查。 
当JVM检测到有一条new指令时,首先先检查该指令的参数是否在常量池中定位到一个类的符号引用,并检查这个符号引用所代表的类是否已被加载、解析和初始化过。如果存在的话,JVM将直接使用已有的信息对该类进行操作。 
如果没有,则执行相应的类加载过程。 
2、为新生对象分配内容。 
不同的JVM垃圾收集器在内容分配的时候的表现也不相同。 
如果使用的收集器带有压缩整理过程,则进行指针碰撞,因为收集器带有压缩整理,所以整个堆内存是绝对规整的,分配内存就仅仅是把指针向空闲空间那边挪动一段与对象大小相等的距离作为对象的内存。 
如果使用的收集器不带有压缩整理过程,此时JVM维护着一个空闲列表,记录着可用的内存块位置和大小,分配时在列表中找到足够大的空间划分给对象实例。 
内存分配完成后,分配到的内存空间都初始化为零,但不包括对象头。 
值得注意的是 
内存分配时的同步问题可以通过以下两种方式进行同步: 
a、对分配内存空间的动作进行同步处理。虚拟机采用CAS(比较并交配,通过3个操作数,内存值V,旧的预期值A、要修改的新值B,当且仅当预期值A和内存值V相同时,才将内存值改成B,否则不分配内存)配上失败重试方式来保证更新操作的原子性。 
b、把内存的分配动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中先预留一块本地线程分配缓冲(TLAB)。哪个线程分配内存时,就在哪个线程的TLAB分配,只有当TLAB用完并分配新的TLAB时,才需要同步锁定。 
3、对对象进行必要的设置。 
例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头之中。 
4、初始化对象。 
当完成上述操作后,对象的内存便分配成功了,但是所有的字段都还是零。 
此时应该执行方法,把对象按照程序员的意愿进行初始化,从而产生一个真正可用的对象。

对象的内存布局

对象的内存布局分为三个区域: 
a、对象头,b、实例数据,c、对齐填充。

  • 对象头:非固定的数据结构。一来是用来存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。二来是类型指针,即对象指向它的类元数据的指针、JVM通过这个指针来确定这个对象是哪个类的实例。如果对象是一个Java数组,则在对象头中还需要有一块记录数组长度数据。
  • 实例数据:存储对象真正有效的信息,也就是程序代码中所定义的各种类型的字段内容。不论是从父类继承下来的,还是在子类中定义的。这部分的存储顺序会受到Java源码中定义顺序的影响。
  • 对齐填充:不一定必然存在。启到占位符的作用。因为JVM的自动内存管理系统要求对象的起始地址必须是8字节的整数倍,即对象的大小必须是8字节的整数倍。故当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

对象的访问定位

对象的访问方式由虚拟机实现,主流的访问方式有两种: 
1、使用句柄访问,Java堆中将会划分出一块内存来作为句柄池,reference中存储的是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。 
2、直接指针访问。Java堆需要考虑如何放置访问类型数据的相关信息,此时reference存放的是对象地址。 
两种访问方式的对比:

  • 使用句柄时,当改变句柄中的实例数据指针时,reference本身不需要被修改。
  • 使用直接指针访问最大的好处在于速度较快,因为其节省了一次指针定位的时间开销。

目前使用直接指针访问的方式比较常用。因为对象的访问在Java程序运行过程中是比较频繁的,积少成多也会造成太多的时间开销。

JVM总结(一):概述--JVM对象探秘的更多相关文章

  1. JVM探究之 —— HotSpot虚拟机对象探秘

    本节以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1. 对象的创建 Java是一门面向对象的编程语言.在语言层面 ...

  2. JVM的GC概述

    JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序 ...

  3. [转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结

    Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知 ...

  4. 深入JVM(二)JVM概述

    深入JVM(一)JVM指令手册 深入JVM(二)JVM概述 一.JVM的原理 Java虚拟机是Java平台的基石,解决了硬件和操作系统的相互独立性.不同平台(Windows,Linux和MacOS)的 ...

  5. 一步步优化JVM一:概述、方法及需求

    现代JVM是一个具有灵活适应各种应用能力的软件,尽管很多应用能够在JVM的默认配置下运行良好,但是有些应用还是需要优化JVM配置以达到其性能要求.由于各种各样的应用能够运行在现在JVM上面,所以大量的 ...

  6. 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性

    https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...

  7. JVM学习(五)对象的引用类型

    一.引言 前面我们学习了JVM的垃圾回收机制,我们知道了垃圾回收是JVM的自发行为:虽然我们可以通过System.gc() 或Runtime.getRuntime().gc()进行显式调用垃圾回收 , ...

  8. 【算法】01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈)

    [算法]01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈) 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有 ...

  9. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

随机推荐

  1. libgdx判断矩形重叠碰撞

    有两种方式. 1. 排除法,排除四种不可能重叠的情况就是了. public static boolean IsOverlap( Rectangle rect1, Rectangle rect2 ){ ...

  2. 并发编程(Concurrent programming)

    并发编程(Concurrent programming) 1.并发编程概述 2.委托(delegate) 3.事件(event) 4.线程(thread) 5.线程池(threadPool) 6.任务 ...

  3. centos7 部署mysql-5.7.20

    一.系统环境 系统:CentOS Linux release 7.5 mysqlb进制包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 1)依赖包安装 yum ...

  4. Python进阶量化交易场外篇4——寻找最优化策略参数

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  5. JAVA每日一旅

    1.关于final关键字 final修饰的成员变量为基本数据类型时,在赋值之后无法改变.当final修饰的成员变量为引用数据类型时,在赋值后其指向地址无法改变,但是对象内容还是可以改变的. final ...

  6. 【SE】Week3 : 个人博客作业(必应词典)

    关于 微软必应词典客户端 的案例分析 [第一部分]  调研,评测 一.用户采访 1)   介绍采访对象的背景和需求: 被采访同学是马来西亚华裔叶能端同学,由于此前在马来西亚英语是第二语言,因此经常需要 ...

  7. 2-Thirteenth Scrum Meeting-10151213

    任务安排 成员 今日完成 明日任务 闫昊 获取视频播放进度  用本地数据库记录课程结构和学习进度 唐彬  阅读IOS代码+阅读上届网络核心代码  请假(编译……) 史烨轩 下载service开发    ...

  8. 《Linux内核分析》第三周

    [李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...

  9. 20135220谈愈敏Blog1_计算机是如何工作的

    计算机是如何工作的 存储程序计算机工作模型 冯诺依曼体系结构 从硬件角度来看:CPU和内存,由总线连接,CPU中有一个名为IP的寄存器,总是指向内存的某一块:CS,代码段,执行命令时就取IP指向的一条 ...

  10. (Alpha)Let's-Chronos分数分配规则

    Requirement: 每个团队开一个讨论会,协商讨论团队贡献分的分配方式.每个团队的团队贡献分为50分/人.每个人分数不能相同,请详细说明分数的分配规则. 为了完成此次的团队贡献分的分配任务,我们 ...