一、HotSpot虚拟机

二、对象的创建

Java对象的创建可以分为五个步骤:

  1. 检查类加载
  2. 分配内存
  3. 初始化零值
  4. 设置对象头
  5. 执行实例构造器

下面我将介绍这五个部分的内容:
1、类加载检查
HotSpot虚拟机遇到一条new指令,会先检查能否在常量池中定位到这个类的符号引用,检查这个类是否类加载过,按照下面情况进行处理:

  1. 没有类加载过就去类加载
  2. 类加载过就进行下一步分配内存

2、分配内存
虚拟机在堆上为新对象分配内存,有两种内存分配的方式:

  1. 指针碰撞
  2. 空闲列表

1)指针碰撞

  1. 使用场景: 堆内存规整整齐
  2. 过程:使用过的空间放在一边,空闲的空间放在另一边,中间有一个指针作为分界点指示器,把新生对象放在使用过空间的那一边,中间指针向空闲空间那边挪动一个新生对象的内存大小的距离即可
  3. 特点:简单,高效,因为要堆内存规整整齐,所以垃圾收集器应该要有压缩整理的能力

2) 空闲列表

  1. 使用场景: 已使用空间和空闲空间交错在一起

  2. 过程: 虚拟机维护一个列表,列表中记录了哪些内存空间可用,分配时找一块足够大的内存空间划分给新生对象,然后更新列表

  3. 特点: 比指针碰撞复杂, 但是对垃圾收集器可以不用压缩整理的能力

3、初始化零值
分配内存完成后,虚拟机将分配的内存空间初始化为零值(不包括对象头) ,这样保证了对象的成员字段(成员变量)在Java代码中不赋初始值就可以使用。

4、设置对象头
把一些信息(这个对象属于哪个类? 对象哈希码,对象GC分代年龄)存放在对象头中 (后面详细说明对象头)

5、执行init方法
一般的初始化方法就是实例变量赋值 、实例代码块和实例构造器三个部分组成,其一般公式如下:
init方法 = 实例变量赋值 + 实例代码块 + 实例构造器

对象的内存布局

三、对象内存信息

对象在堆中的内存布局可以分为三个部分组成:

  1. 对象头
  2. 实例数据
  3. 对齐填充

1、对象头包括两类信息(8Byte + 4Byte)
4. Mark Word:用于存储该对象自身运行时数据(该对象的哈希码信息,GC信息:分代年龄,锁信息:状态标志等)
5. 类型指针(对象指向它类型元数据的指针):HotSpot通过类型指针确定该对象是哪个类的实例 (如果该对象是数组,对象头中还必须记录数组的长度) 类型指针默认是压缩指针,内存超过32G时为了寻址就不能采用压缩指针了

2、实例数据是对象真正存储的有效信息

  1. 记录从父类中继承的字段和该类中定义的字段

  2. 父类的字段会出现在子类字段之前,默认子类较小的字段可以插入父类字段间的空隙以此来节约空间(+XX:CompactFields)

3、对齐填充

HotSpot要求对象起始地址必须是8字节整倍数 。因此,任何对象的大小都必须是8字节的整倍,如果对象实例数据部分未到达8字节就会通过对齐填充进行补全

四、对象头

分析对象占用对晒需要导入JOL依赖:

<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core --><dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.12</version></dependency>

新建对象的各个占用情况如下:
1、mark word : 8 byte
2、类型指针: 4 byte
3、对齐填充 12->16 byte
JVM的结构图
下图为JVM的虚拟机的结构图

五、对象的访问定位

1、Java程序通过栈上的reference类型数据来操作堆上的对象,其访问方式如下:

  1. 对象实例数据: 对象的有效信息字段等(就是上面说的数据)
  2. 对象类型数据: 该对象所属类的类信息(存于方法区中)

2、句柄访问方式
在堆中开辟一块内存作为句柄池,栈中的reference数据存储的是该对象句柄池的地址,句柄中包含了对象实例数据和对象类型数据

  1. 优点: 稳定,对象被移动时(压缩或复制算法),只需要改动该句柄的对象实例数据指针
  2. 缺点: 多一次间接访问的开销

3、 直接指针访问

栈中的reference数据存储堆中该对象的地址(reference指向该对象),但是对象的内存布局需要保存对象类型数据,其优缺点如下:

  1. 优点: 访问速度快
  2. 缺点: 不稳定,对象被移动时(压缩或复制算法),需要改动指针

Java虚拟机之HotSpot虚拟机相关推荐

  1. java中判断undefined_Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  2. JVM Hotspot 虚拟机与 DalvikART 虚拟机堆栈的区别

    文章目录 Hotspot 虚拟机与 Dalvik 虚拟机的区别 Android 内存管理模型 JVM 与 Dalvik 虚拟机在栈的区别 AOT(Ahead Of Time)预先编译机制 JVM 与 ...

  3. HotSpot虚拟机中的intrinsic是指什么?

    前言 本文隶属于专栏<100个问题搞定Java虚拟机>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟 ...

  4. Java 14 Hotspot 虚拟机垃圾回收调优指南!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 大鹏123 来源 | www.cnblogs. ...

  5. HotSpot虚拟机在Java堆中对对象的管理

    在大概了解了Java虚拟机中内存的大致分布后,接下来就应该了解虚拟机是如何在内存中管理对象的,毕竟Java是一门面向对象的语言,在Java程序的运行过程中会不断有对象创建出来.为了方便,这里仅仅以Ho ...

  6. Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)

    本文内容总结自周志明先生所编著的<深入理解Java虚拟机-JVM高级特性与最佳实践>此书的经典不必多说.本节内容是对象的内存布局. 在HotSpot虚拟机中,对象在内存中存储的布局可以分为 ...

  7. Java HotSpot 虚拟机选项 -X -XX 的含义

    1.JDK 7 及以前版本 官方文档对 -X.-XX的说明如下: Options that begin with -X are non-standard (not guaranteed to be s ...

  8. java 指定垃g1圾收集_【译】Java 14 Hotspot 虚拟机垃圾回收调优指南

    本文主要包括以下内容:优化目标与策略(Ergonomics) 垃圾收集器实现(Garbage Collector Implementation) 影响垃圾收集性能的因素总堆(Total Heap) 年 ...

  9. Java 虚拟机之HotSpot简介

    1. HotSpot 简介 Java是解释语言,但并不意味着它一定被解释执行.早期的虚拟机确实一条一条指令解释执行,但人们发现这样效率太低,不满足各种要求,因此出现了许多其它虚拟机,如JIT的虚拟机. ...

  10. JVM基础 之Java HotSpot虚拟机中的内存管理

    1  简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...

最新文章

  1. TCP/IP,Http,Socket的区别
  2. DDoS攻击走向应用层
  3. Laravel——消息通知
  4. 系统管理员设置了系统策略,禁止进行此安装
  5. springboot @value启动报错_打造一个 Spring Boot 注解启动控制开关
  6. 我用 Python 帮朋友做了张图,结果
  7. 国网“泛在电力物联网”的战略与逻辑
  8. Oracle分页排序采坑记录
  9. nginx配置中root与alias的区别
  10. 【C++ primer】第七章 函数-C++的编程模块
  11. Java - 泛型 ( Generic )
  12. 防风网-挡风抑尘墙:挡风抑尘墙
  13. 结构与表现分离的思想
  14. nlp基础—10.结巴分词的应用及底层原理剖析
  15. windows2003视频教程
  16. 自制力差的元凶及习惯的养成过程
  17. 数字图像分辨率的认识
  18. python3 进程池Pool 详解
  19. Win10怎么默认用Windows照片查看程序打开图片
  20. 上传图片查看上传的图片

热门文章

  1. 基于Java+SpringBoot+mybatis+vue+element实现旅游管理系统
  2. java 如何查询数据库_java怎么查询数据库
  3. axure导入的元件库不见了_Axure教程丨制作自己的Axure元件库
  4. matlab求带参数二重定积分,matlab二重定积分
  5. 2021年下半年软考-网络工程师答案及解析(中级)
  6. MySql常用函数大全讲解
  7. 用 Java 实现人脸识别功能
  8. 少儿编程python学啥-少儿编程学什么?少儿编程课程体系介绍
  9. vim 快捷键大全和插件大全
  10. XenCenter导出和导入模板