JVM的对象

Jvm对象创建过程 jvm创建对象主要经过检查加载、分配内存、内存空间初始化、设置对象头、初始化对象几个阶段。 检查加载 检查类是否已经被加载、解析和初始化过。虚拟机遇到一条new指令时,首先检查是否被类加载器加载。如果没有,则执行相应的类加载过程。类加载就是把class加载到JVM的运行时数据区的过程。如果有多个线程,只会有一个线程完成类加载。JVM保证类加载是线程安全的。 分配内存 类加载无误后,开始为对象分配空间。即把一块确定大小的内存从Java堆... 阅读详情

对象创建的几种方法

这部分的内容回头再补充

  • 使用new关键字创建:
Object object = new Object();
  • Class类下的newInstance()方法:
Object objet = Class.class.newInstance();
  • Constructor类下的newInstance()方法

对象的内存分配

将Java堆的内存空间看成两部分,一部分是使用过的,另一部分是未使用过的。在两者交界处有一指针作为分界点的指示器,给新增对象分配空间主要移动这个指针就行了,成为指针碰撞。如果Java堆中的内存并不是规整的,使用与未使用的内存相互交错,虚拟机就必须维护一个表,记录着那些内存块是可用的,在分配时从列表中找到一块足够大的空间划分给对象,这种分配方式称为空闲列表。
为了防止在给对象A分配空间时,指针还未来得及修改,对象B又同时使用了原来的指针来分配内存。解决方案有两种,一种是对分配内存空间的动作进行同步处理——实际上虚拟机采用CAS分配上失败重置的方式保证更新操作的原子性;另一种是把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预分配了一份小块内存——本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。哪个线程要分配内存,就在哪一个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才需要同步锁定。
虚拟机将分配的内存空间都初始化为零(不包括对象头),然后要对对象进行必要的设置,例如这个对象是哪一个类的实例、如何找到类的元信息、对象的哈希码、对象的GC分带年龄等信息。这些信息都包含在对象头中。

Java对象的内存布局

  • 在HotSpot虚拟机中,对象在内存中储存的布局分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
  • HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时的数据(哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳),这部分数据的长度在32和64位的虚拟机分别为32bit和64bit,官方称为**“Mark Word”**。
  • 对象需要存储的运行时的数据很多,其实已经超过32位、64位Bitmap结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计为一个非固定的数据结构以便在绩效的空间内存储尽量多的信息,它根据对象的状态复用自己的存储空间。例如,在32位的HotSpot虚拟机中,如果对象处于被锁定的状态下,那么Mark Word的32bit的空间中25bit用于存储对象的哈希码,4bit用于存储对象的分代年龄,2bit用于存储锁标志位,1bit固定为0,其余状态如下图
存储内容标志位状态
对象哈希码、分代年龄01未锁定
指向锁记录的指针00轻量级锁
指向重量级锁的指针10膨胀
空,不需要记录信息11GC标志
偏向线程ID、偏向时间戳、对象分代年龄01可偏向

对象头的另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。也并不是所有的虚拟机实现都必须在对象数据上保留指针类型,也就是说查找对象的元数据信息并不一定要经过对象本身。如果对象是一个Java数组,那么对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小———补充在Java数组上会以少量的内存开销及运行时的下标检查为代价,确保安全性和效率的提高。

实例数据(Instance Data)
实例数据不符是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论从父类继承下来,还是子类中定义的,都需要记录起来。
对齐填充(Padding)
对齐填充并不是必然存在的,也没有特别的含义,它仅起着占位符的作用,由于HotSpot VM的自动内存管理系统要求对象其实地址必须要8字节的整数,换句话说,就是对象的大小必须是8个字节的整数倍。对象头正好是8的倍数,但是实例数据不一定,当实例部分数据没有对齐时,需要对齐填充来补全以满足8的倍数。

对象的访问定位

访问对象,需要Java虚拟机栈上的栈帧的局部变量表中的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该它能够个何种方法去定位、访问堆中的对象的具体位置所以对象的访问方式也是取决于虚拟机实现而定的。目前主流的两种访问方式是句柄和直接指针。
句柄(Handle)
先介绍下什么是句柄

// object--->句柄
Object object = new Object();
// str句柄
String str = "s1";
//使用句柄操作
str = "Handle";
//这里创建的只是一个句柄,并不是一个对象,引用地址创建好了,
//但是不指向任何东西,输出会报错,提示初始化操作
String s;
System.out.print(s);

感觉平时操作对象什么的,都是用句柄操作咦。。。。
如果使用句柄访问的话,那么Java对中将会划分出一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体信息。
图片导入来自
在这里插入图片描述
指针
如果使用指针访问,那么Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址,如下图。
在这里插入图片描述

这两种对象的访问各有优势,使用句柄访问的最大好处就是reference中存储的是文档的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改。

直接使用指针访问方式的最大的好处就是快,它节省了一次指针定位的时间开销,由于对象的访问在Java中非常非常频繁。就Hotspot虚拟机而言,它是使用第二种方式进行访问对象,但是从整个软件的开发过程来看,各种语言和框架使用句柄来访问的情况也十分常见。

【JVM 系列】JVM 对象的分配策略 针对那些作用域不会逃逸出方法的对象,在分配内存时不在将对象分配在堆内存中,而是将对象属性打散后分配在栈(线程私有的,属于栈内存)上,这样,随着方法的调用结束,栈空间的回收就会随着将栈上分配的打散后的对象回收掉,不再给gc增加额外的无用负担,从而提升应用程序整体的性能。...... 阅读详情

相关推荐

【JVM 系列】JVM 对象的分配过程

虚拟机遇到一条 new 指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程。类加载就是把 class 加载到 JVM 的运行时数据区的过程。下面我们先来看一张图:首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用(符号引用 :符号引用以一组符号来描述所引用的目标),并且检查类是否已经被加载、 解析和初始化过。符号引用 :符号引用以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量,JAVA 在编译的时候每个 java 类都会被编译成一个 class 文件,但在编译的

半身风雪 795

深入了解JVM中的对象

1.对象的创建方式及是否调用构造方法 new 无参/有参构造 clone 不调用构造方法,由 JVM 创建新的对象并赋值字段。 反序列化 调用第一个没有实现序列化接口的父类的无参构造,如果没有,则调用 Object 类的无参构造 Class.newInstance 无参构造,实际上是调用 5 的无参构造 Constructor.newInstance(…args) 无参/有参构造 2.对象的创建流程 public class Test { private int anInt = 1; p

qq_44707077的博客 371

【光学仿真】基于Matlab的LG/BG/PV/HG光束生成与特性分析【附完整源码】

本文详细介绍了如何使用Matlab进行拉盖尔-高斯(LG)、贝塞尔-高斯(BG)、完美涡旋(PV)和厄米-高斯(HG)四种特殊光束的仿真与特性分析。通过提供完整的Matlab源码,手把手指导读者生成光束、分析其强度、相位、传播特性及轨道角动量,为光学研究、激光应用及教学提供了直观高效的数值实验平台。

3a9bq4r8t2y的博客 494

【JVM】详解对象的创建过程

并发情况下,需要考虑操作的步骤是不是原子性,如果不是,就要加锁。原子性就是动作不能再继续被拆分了,读是原子性,写也是原子性,但是读+写就不是原子性。

m0_51963973的博客 2534

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

fyihdg的专栏 1218

从数据到特征:基于CAT12的MRI图像预处理实战指南

本文详细介绍了使用CAT12工具进行MRI图像预处理的完整实战流程。从数据获取、环境搭建到核心的AC-PC校正、组织分割、空间标准化与调制,逐步解析如何将原始脑影像数据转化为可用于机器学习的标准化特征图。重点阐述了预处理作为脑影像分析‘生命线’的重要性,并提供了避坑指南与自动化脚本建议,帮助研究者构建高质量的阿尔茨海默症分类模型输入特征。

weixin_29065959的博客 310

【JVM专题】JVM对象创建与内存分配机制深度剖析

创建对象的主要流程,基本如下图所示: 接下来我们分析一下各个阶段的含义。虚拟机在遇到一条new指令的时候,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查其代表的类是否已经被加载、解析、初始化过了,如果没有则走第一节课提到的从类加载子系统LoadClass那一套。对象所需内存的大小,其实在类的加载完成后就可以确定了,为对象分配内存,本质上就是从堆里面,找一块大小合适的地方,给对象使用,在这个过程中,需要解决两个问题。接下来我们一个问题一个问题解决。我们常用的解决方案有2个,【指针

qq_32681589的博客 1234

基于ADMM的TV正则化最小化稀疏实现图像重建

ADMM算法是一种求解带有约束条件的优化问题的有效方法,它可以将原问题分解成两个子问题,然后交替求解这两个子问题,直到收敛。为了解决这些问题,研究人员提出了许多图像重建方法,其中一种常用的方法是基于正则化的方法。在图像重建中,TV正则化是一种比较常用的正则化方法,可以有效地降低图像的噪声,并保持图像细节特征。通过本文的介绍和源代码的演示,我们可以看出基于ADMM的TV正则化最小化稀疏实现图像重建的方法是一种简单、高效、有效的图像重建方法,能够在一定程度上提高图像质量,对于实际应用具有一定的参考意义。

学习使你进步。 1762

深入理解Java虚拟机:对象创建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 前言 一、对象的创建 二、对象的内存布局 2.1对象头 2.2实例数据 2.3对齐填充 三、对象的访问定位 前言 Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? ..

xyq0431700的博客 240

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 148

基于matlab的形态学的权重自适应图像去噪

数学形态学以图像的形态特征为研究对象,通过设计一套独特的数字图像处理方法和理论来描述图像的基本特征和结构,通过引入集合的概念来描述图像中元素与元素、部分与部分的关系运算。因此,数学形态学的运算由基础的集合运算(并、交、补等)来定义,并且所有的图像矩阵都能被方便地转换为集合。随着集合理论研究的不断深入和实际应用的拓展,图像形态学处理也在图像分析、模式识别等领域起着重要的应用。实验结果表明,如果仅通过串联滤波器去噪,则往往具有一定的局限性,在结果图像中也保留着较为明显的噪声。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 757

【深入理解JVM】:Java对象的创建、内存布局、访问定位

对象的创建一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行ini方法等。主要流程如下:1. 类加载检查JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类的加

smile4lee的博客 1万+

C语言中errno与perror()函数

宏errno和perror()函数都是在stdlib.h中定义的。 1 stdlib.h头文件 stdlib.h头文件即standard library标准库函数头文件,包含了C、C++语言的最常用的系统函数,该文件中还包含了C语言标准库函数的定义。 2 errno宏 errno宏在stdlib.h中的定义为 #define errno (*_errno()) errno宏用于保存程...

hou09tian的博客 1万+

JVM中对象的创建

类加载:类字节码从磁盘加载到内存。内存分配:在堆内存中为对象分配空间。字段初始化:给对象的成员变量赋默认值或显式值。构造方法调用:父类构造器先执行,之后执行当前类构造器。返回对象引用:返回指向对象的引用。JVM 对象的创建过程是理解 Java 内存管理、性能优化和垃圾回收的基础。通过深入理解这些细节,可以更好地编写高效的 Java 程序,并有效管理对象的生命周期。

m0_69529796的博客 1649

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1646

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA JVM对象的实现

JVM对象内存分配与访问机制: JVM对象内存分配主要分为类加载检查、内存分配、初始化和对象头设置等步骤。分配方式包括指针碰撞(适用于规整内存)和空闲列表(适用于不规整内存)。为确保线程安全,JVM采用CAS或TLAB机制。对象内存布局由对象头(含MarkWord和类型指针)、实例数据和对齐填充组成。对象访问方式包括句柄访问(稳定但性能低)和直接指针访问(性能高但需修改引用)。HotSpot虚拟机默认采用直接指针访问方式以提高性能。

best_virtuoso的博客 1284

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM系列 | 对象的创建与存储

当JVM遇到你的new关键字之后,都做了什么呢?通过本文章,详细了解对象的创建过程! 本文包含图文模型、代码示例等,详细描述了对象创建过程、对象的内存O型、对象的寻址等,所有知识尽在其中!

Jim.kk的笔记 1528

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java 深入解析:JVM对象创建与内存机制全景图

本文系统、深入地讲解了Java 8中JVM对象的创建、内存布局、访问定位方式、与垃圾回收器的交互、以及内存管理机制(包括堆与非堆内存)。同时还扩展探讨了对象引用类型、对象的equals与hashCode机制、序列化实现原理及其对性能的影响。全篇配有Java 8代码示例,理论与实战并重,帮助读者全面掌握JVM对象的工作机制,是每一位Java开发者都不容错过的进阶指南

持续输出Java相关知识 1233

JVM---jvm对象

1.对象的创建 对象的创建大概可以分为5步,流程如下图所示 1.类加载检查 虚拟机遇到一条new指令时,首先在常量池中定位到这个类的符号引用,然后检查这个符号引用代表的类是否已经被加载过、解析和初始化过,如果没有,那必须先执行相应的类加载过程。 2.分配内存 就是在类加载完成之后,为对象分配实际的内存,对象的大小会在类加载的时候知道,分配内存就是把一块确定大小的内存从Java堆里分出来。有“指针碰撞”和“空闲列表”两种方式。 内存分配并发问题 在创建对象的时候有一个很重要的问题,就是线程安全,因为在实际

qq_47125845的博客 305

三、jvm中的对象及引用

检查加载-->分配内存-->内存空间初始化-->设置-->对象初始化。

空杯 1266

对象的创建过程-解释

在之前的文章中,我们介绍了类加载的过程和 JVM 内存布局相关的知识。本篇我们综合之前的知识,结合代码一起推演一下对象的真实创建过程,以及对象创建完成之后在 JVM 中是如何保存的。

huang714的专栏 1372

JVM学习(四)JVM中的对象及引用

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)如何准备面试?1、前期铺垫(技术沉积)程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

2401_84004078的博客 968

JVM - 对象的创建

JVM - 对象的创建

目目沐沐 4万+

jvm之对象

这里是对jvm中对象的创建过程,内存分布,内存定位的一个简单描述。都是根据书中的信息整理出来的。 一,对象的创建过程 1,查看类是否被加载 当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那 必须先执行相应的类加载过程。 2,分配空间 分配空间的两种方式 (1)指针碰撞 假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一 边,空闲的内存被放在另一边,中间放着一个指针

weixin_47327232的博客 193

JVM-对象

对象的生命周期 创建阶段(Created) 为对象分配内存,开始构造对象,递归调用其超类的构造方法,进行对象实例初始化和变量初始化 应用阶段(In use) 至少维护着对象的一个强引用 不可见阶段(Invisible) 程序的运行已经超出了该对象的作用域了,强引用已经消失 不可到达阶段(Unreachable) 在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用,这些对象都是要被垃圾回收器回收的预备对象,但此时该对象并不能被

weixin_41278297的博客 255

Java对象与JVM(一) Java对象在Java虚拟机中的创建过程

下面我们详细了解Java程序中new一个普通对象时,HotSpot虚拟机是怎么样创建这个对象的,包括5个步骤:相应类加载检查过程、在Java堆中为对象分配内存、分配后内存初始化为零、对对象进行必要的设置、以及执行对象实例方法,最后我们再从JVM指令角度来解释下Java对象创建。

tjiyu的博客 1万+
上一篇: JVM学习历程---(虚拟机结构图)
下一篇: JVM的GC
Richard331
博客等级 码龄11年 3粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值