Java是一种面向对象的语言,所以Java程序在运行时和对象相关的操作非常频繁,这包括创建对象,定位对象并对其访问

对象创建

从JVM虚拟机工作的角度,对象的创建要经过两个步骤:内存分配,对象初始设置

1.内存分配

对象创建起始于虚拟机遇到一条new指令,之后虚拟机会先检查方法区中的常量池,检查指令的参数能否在常量池中定位到一个类的符号引用,检查到之后,检查这个符号引用代表的类是否已被加载,解析和初始化,如果没有,需要先进行类的初始化

对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来

为对象分配内存的方式有两种,指针碰撞和指针碰撞

1)指针碰撞

如果内存是绝对规整的,所有用过的内存都在一边,没用过的另一边,一个指针指向两边的分界点,那么把指针向空闲空间那一边移动将要创建对象的大小的空间,这种分配方式称为指针碰撞

2)指针碰撞

虚拟机维护一个记录空闲内存块的列表,分配时从列表中找出一块足够大的空间划分给对象实例,并更新列表,这种分配方式称为空闲列表

2.对象初始设置

接下来,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息都会被存放到对象的对象头(Object Header)之中。

对象的内存布局

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(InstanceData)和对齐填充(Padding)

1.对象头(Header)

HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为Mark Word。对象需要存储的运行时数据很多,其实已经超出了32位、64位Bitmap结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间

对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身。另外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中却无法确定数组的大小

2.实例数据(InstanceData)

实例数据部分存储对象真正的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义顺序的影响。

HotSpot虚拟机默认的分配策略为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),从分配策略中可以看出,相同宽度的字段总是被分配到一起。在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。如果CompactFields参数值为true(默认为true),那么子类之中较窄的变量也可能会插入到父类变量的空隙之中

3.对齐填充(Padding)

对齐填充并不是必然存在的,起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(1倍或者2倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全

对象的访问

Java程序通过Java栈上的reference类型的数据来操作堆上的具体对象。这个reference类型的数据一般是一个句柄或直接指针

使用句柄访问对象

使用直接指针访问对象

JAVA虚拟机创建对象相关推荐

  1. Java内存管理-一文掌握虚拟机创建对象的秘密(九)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识梳理 1.Java内存管理-程序运行过程(一) 2 ...

  2. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  3. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  4. 深入理解 Java 虚拟机-如何利用 VisualVM 对高并发项目进行性能分析

    来自:好好学java 前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择Visua ...

  5. 06.Java虚拟机问题

    目录介绍 6.0.0.1 运行时数据区域有哪些?Java虚拟机栈是做什么的?本地方法栈又是做什么的? 6.0.0.2 对象的内存布局?对象的访问定位方式有哪些?使用指针访问和使用句柄访问各具有何优势? ...

  6. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...

  7. 怎么把虚拟机清空内存_深入理解java虚拟机1——内存管理机制与回收机制

    文中涉及JVM底层知识大多来自<深入理解Java虚拟机>第2版,内容枯燥乏味,如果看,认真看.跟着撸一遍也可以受益良多. 1.JVM:是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  8. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

  9. 深入理解Java虚拟机——程序编译与代码优化 (转)

    2019独角兽企业重金招聘Python工程师标准>>> 深入理解Java虚拟机--程序编译与代码优化 (转) 博客分类: java 一早期(编译期)优化 1概述 Java语言的&qu ...

  10. Java虚拟机2:Java内存区域及对象

    几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念. 1.计算机存储单位 从小到大依次为位Bit.字节Byte.千字节KB.兆M.千兆GB.TB,相邻 ...

最新文章

  1. 阿里架构师眼中Dubbo的过去,现在以及未来
  2. [设计模式] 8 组合模式 Composite
  3. django-oscar相关的模块调研信息汇总
  4. ikbc机械键盘打字出现重复_超小无线机械键盘,绝佳移动打字体验
  5. Linux 多线程编程 (典藏、含代码)
  6. java建设银行支付_基于JAVA的建设银行账目管理系统的设计
  7. ADMM算法求解一个简单的例子
  8. 使用ECS和OSS搭建个人网盘(阿里云官方)
  9. Win32Forth初学者指导-前言
  10. 如何在 Spring Boot 优雅关闭加入一些自定义机制
  11. Karl Guttag:谈MicroLED AR光学难点,Mojo Vision还有很多问题
  12. 华为云弹性云服务器助力打造更安全可靠、灵活高效的云空间
  13. Msfvenom使用指南
  14. 在校大学生学业预警系统java_关于学业预警系统上线使用的通知
  15. 人工智能之深度优先,广度优先,贪婪最佳优先搜索,A*搜索以及爬山法与遗传算法
  16. E-Mobile 后台管理系统漏洞
  17. 2022Q3手机配件增长榜:手机壳、数据线等供求不断增加
  18. Unity C#图片转换二进制流、精灵与Png、jpg互转
  19. powerdesigner绘制UML模型(包括用例图、类图、时序图、E-R图……)
  20. 鼎捷ERP二次开发教程 Tiptop GP开发资料大全 Tipto开发实战经验 鼎捷开发实战例子 Tiptop GP二次开发项目例子 4GL开发Demo 鼎捷二次开发完整例子 鼎捷ERP二次开发入门

热门文章

  1. mysql5.5.50安装包_影视混剪每天收入400多??总结了50多款软件
  2. python3.1415926_Python3中操作字符串str必须记住的几个方法
  3. Scrypt哈希算法简介
  4. pscp使用详解 Windows与Linux文件互传工具
  5. 算法笔记_面试题_18.动态规划_模板及示例十几道(上)
  6. 数据结构_满二叉树、完全二叉树、二叉排序树、平衡二叉树
  7. 算法笔记_面试题_4.树的遍历(前序/中序/后续遍历)
  8. Curve Modeling:车道线检测新工作(CVPR2022)
  9. 第 2 讲 初识 SLAM
  10. 第三章:数组[4Arrays]