【JVM学习笔记】对象的创建

【JVM学习笔记】对象的创建过程、 对象的内存布局、 如何定位和使用对象 如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“对于JVM来说,对象已经被初始化完毕了,但是对于Java程序来说,对象的创建从构造函数才真正开始,当Class文件中的()方法还没有执行,所有的字段都为默认的零值,对象需要的其他资源和状态信息也还没有按照预定的意图构造好。 阅读详情

对象的创建

new类名—>

根据new的参数在常量池中定位一个类的符号引用—>

如果没有找到符号引用,说明类还没有被加载,则进行类的加载,解析和初始化—>

虚拟机为对象分配内存(位于堆中)—>

将分配的内存初始化为零值(不包括对象头)—>

调用对象的<init>方法

 

给对象分配内存

堆内存是不连续的,假设堆内存连续的,有一个类似于指针的东西,用于分割使用和未使用的内存区域,当new一个对象的时候指针向未使用的内存方法移动一部分,移动的大小(下图阴影区域)就是创建该对象所使用的内存大小,这种方式称为指针碰撞方式。

 

当堆内存是不连续的时候,可以采用一张表记录所有空闲的内存区域,当使用后再从表中将被使用的内存区域从表中删除,这种方式称为空闲列表的方式。

 

线程安全性问题

指针碰撞方式,当多个对象同时new的时候,指针的移动容易造成线程不安全,

解决方式:

1、线程同步

2、本地线程分配缓冲(TLAB)——即将内存区域划分成多个子区域,采用多个线程分别对多个子区域进行操作。(如图)

空闲列表方式也可能会造成线程不安全,也可以采用线程同步进行解决。

 

对象的结构

Header(对象头:对象的元数据)

           对象头主要存储的东西:

           自身运行时数据:哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳

           类型指针:对象指向类的元数据的指针,并非一定需要

InstanceData:实例数据

Padding:自动填充,字节位数不满进行填充

 

对象的访问定位

1、使用句柄

如果使用句柄访问方式,Java堆中会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。使用句柄方式最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。

 

2、直接指针

如果使用该方式,Java堆对象的布局就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址。使用直接指针方式最大的好处就是速度更快,他节省了一次指针定位的时间开销。

 

 

 

 

 

智启古文字新章:AI、ML与大数据驱动的知识图谱构建 摘要:本文聚焦AI、ML与大数据驱动的古文字知识图谱构建。开篇点明古文字研究困境,凸显技术革新迫切性。随后阐释AI、ML、大数据基础概念,详解其在图谱构建里的数据采集、知识抽取、关系挖掘运作流程,穿插线性代数、概率论等数学原理。实战展示殷商甲骨文图谱搭建全程,含数据处理、模型训练。还探讨跨模态融合等前沿挑战应对,兼述技术融合衍生的教育科普革新、伦理文化责任、国际合作交流,勾勒古文字数字永生的长远愿景。 阅读详情

相关推荐

两种方法解决这个问题OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

两种方法解决这个问题OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.在进行深度学习比如在训练yolov8模型时,在加载训练集和验证集时会报以下那个错误时会导致模型训练中断,有以下两个方法去解决这个问题,来使模型正常训练。

weixin_73044854的博客 2万+

Java对象解密

1. 对象的创建 检查类是否加载:虚拟机遇到一条new指令时,先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有必须先执行相应的类加载过程; 分配内存:类加载检查通过后,接下来虚拟机将为新对象分配内存,对象所需的内存大小在类加载后可以确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。这个操作有两种方法:指针碰撞(内存规整)、空闲列表(内存不规整)。 为对象分配内存时的指针修改并不是线程安全的,解决

dms2017的博客 335

SDI-12协议与STM32 进行uart通信

其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR_OUT_SDI使能stm32输出,拉高DIR_OUT_SDI失能输出,串口配置8位数据位,偶校验,1位停止位,1200波特率。示波器测试得到传感器的应答信号如下:第一个是唤醒信号,拉高电平13毫秒,之后保持20毫秒低电平,第二个数据帧是激活信号,即ascii码: "0!",第三个是传感器的应答信号:"0\r\n"

weixin_42186805的博客 4407

JVM学习笔记-2 对象的创建

JVM学习笔记-2 对象的创建 1 new指令 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java...

刘越洋子 353

ATAC-seq差异分析实战:从原始数据到GO富集(R/Bioconductor全流程)

本文提供了ATAC-seq差异分析的完整R/Bioconductor实战流程,涵盖从原始数据准备、一致峰集构建、计数矩阵生成,到使用DESeq2进行差异可及性分析,以及差异峰的基因组注释与GO富集分析。文章详细讲解了关键步骤、参数设置和常见问题,旨在帮助研究者获得可靠且可解释的生物学结果。

weixin_29246195的博客 232

YOLOv8剪枝 稀疏训练+slim剪枝测试精度仅掉1.6个点,速度提高10.3fps!

摘要 本文介绍了YOLOv8剪枝方法Slim(Network Slimming),通过L1正则化作用于BN层的缩放因子(γ),自动识别并剪除冗余通道,实现模型轻量化。核心步骤包括:稀疏训练(引入L1正则化)、通道剪枝(按γ阈值裁剪)、微调恢复精度。实验表明,该方法能有效压缩模型大小、减少计算量,且支持通过调整speed_up等超参数控制剪枝强度。移植代码需修改C2F模块以适配剪枝,并配置稀疏训练参数(如reg、sl_epochs)。最终剪枝模型需移除优化器以减小体积,但不支持多卡训练。

FJN110的博客 862

JVM学习笔记——对象的创建过程

title: JVM学习笔记——对象的创建过程 date: 2018/9/1 16:01:35 description: 最近开始着手JVM的学习,在这里把自己学习过程中的笔记分享出来,希望能帮到一些小伙伴,同时也是对自己的学习的一个梳理。 对象的创建过程 检查该类是否已经被加载、解析、初始化,没有则执行类加载。(详细类加载的过程稍后再做介绍) 类加载检查通过后,从Java堆中划分出一块空间,为...

weixin_30480651的博客 96

UDF学习(四)FLUENT UDF-DEFINE_PROFILE宏

利用DEFINE_PROFLILE可以指定以下边界或计算域信息:DEFINE_PROFILE(name,t,i)//既可以用。

weixin_44386973的博客 1807

JVM学习笔记:对象的创建

  第一步,类检测   1、当虚拟机遇到一条new指令时,首先判断new的对象是否能在运行时常量池中找到对应类的类名(书中原话:检查这个指令的参数能佛在常量池中定位到一个类的符号引用)。如果没找到,应该就会抛ClassNotFound了。   2、检查类是否被加载、解析和初始化过,如果没有,就必须执行相应的类加载过程。   第二步,分配内存   1、指针碰撞:在java堆内存绝对规整的情况...

weixin_30552635的博客 74

基于MATLAB实现语音信号MFCC特征提取(附完整代码)

你有没有想过你的智能手机是如何理解语音指令的?或者 Alexa 和 Siri 等语音助手如何处理您的命令?这种卓越能力背后的机制在很大程度上归功于一种称为 Mel 频率倒谱系数 (MFCC) 的方法。语音识别技术允许机器解释人类语音,将口语转换为计算机可以操纵的格式。这项技术对于开发交互式和响应式 AI 至关重要,例如声控助手、自动化客户服务系统和实时翻译服务。MFCC 代表 Mel 频率倒谱系数。这是用于自动语音和说话人识别的功能。

baidu_34971492的博客 1315

29、智能问答系统:原理、挑战与实现

本文深入探讨了智能问答系统的原理、挑战与实现方法。从智能问答系统的定义、重要性、问题类型和构建步骤,到实现中的歧义问题、数据集创建及基于规则的系统实现,全面解析了这一自然语言处理领域的重要应用。同时,文章还介绍了智能问答系统的应用场景、发展趋势以及面临的挑战与应对策略,为读者提供了一个全面而深入的理解框架。

redis7keeper的博客 165

对象创建- JVM学习笔记

对象的创建过程 在语言层面,创建对象只需一个new关键字即可,但再虚拟机中普通对象的创建过程呢? ClassType class1= new ClassType(); 首先,1.7中在方法区中存在一块儿空间,叫做常量池,用于存放编译期生成的各种字面量信息和符号引用; 虚拟机再遇到new指令时, - 首先检查指令的参数是否再常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是...

lb123567的博客 190

基于STM32F4XX 、HAL库的SHT40-CD1B-R3温湿度传感器驱动应用C语言程序设计

define SHT40_ADDR_READ 0x8B // CD1B 读地址 ((0x45 << 1) + 1)#define SHT40_ADDR_WRITE 0x8A // CD1B 写地址 (0x45 << 1)// 初始化 I2C1 (根据 CubeMX 生成的函数)// 湿度: -6%RH + 125%RH * (raw / 2^16)// 温度: -45°C + 175°C * (raw / 2^16)// 返回值: 0=成功, 1=失败(CRC错误或I2C通信错误)

PP_Cottage的博客 237

JVM学习笔记(二)对象创建

对象创建过程对象的创建 对象的创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象仅仅是一个new关键字而已。而在虚拟机中,对象(限于普通Java对象,不包括数据和Class对象等)的创建又是怎样一个过程呢? 当Java虚拟机遇到一个new关键字时,首先检查常量池中是否含有该对象,并且检查这个符号代表的类是否已被加载、解析和初始化过。如果没有,必须要先执行相应的类加载过程。 在类检查通过后,接下来虚拟机要为对象分配内存。分配内存有两种方式,假设Jav

weixin_46970528的博客 468

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM学习笔记(七)对象创建过程(上)

对象的创建 对象(讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建是一个怎样的过程? 所以,我们按照图上的过程来进行对象创建过程的分析。 Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化。在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象,这种方式在Java规范中被称为 : **...

qq_37692087的博客 636

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM 学习笔记 (一) 对象的创建过程

在Java里,创建对象只需要new 关键字即可。那么JVM是怎么去创建对象的呢? 当JVM 遇上new 关键字? JVM 遇上new 指令时 第一步 类加载检查 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个类是否已经被加载。如果没有加载,就去加载类。 简述一下: 在常量池中定位类的符号引用,检查类是否被加载初始化 如果没有被加载就会去加载初始化类 第二步 ...

叶自飘零水自流的的博客 241

JVM学习笔记-02-JVM的分区及其创建对象的过程

一.JVM分区JVM其实按我理解应该这样写 J’VM,其实它就是运行java程序的虚拟机,虚拟机说白了就相当于我们平时用的各种操作系统,windows,linux,等等.他的分区是和系统分区大体原则上是一致的.(2017年8月9日10:23:22)JVM的运行时 分区情况 如图: 当初刚接触java的时候就了解过,堆,栈,方法区的概念,其实这是JVM的数据存储模型. 1.程序计数器程序计数器是一

Mr_Hou2016的博客 532

JVM学习笔记12-对象的结构及创建

1 对象的创建过程 new 类名 根据new的参数在常量池中定位一个类的符号引用 如果没有找到这个符号引用.则进行类的加载,解析和初始化 JVM为对象分配内存–位于堆中 将分配的内存初始化为零值(不包括对象头) 调用对象的<init>方法 2.给对象分配内存 1.指针碰撞 2.空闲列表 3.内存分配线程安全问题 解决方案 本地线程分配缓冲 线程同步 ...

lu322313的博客 170

JVM学习笔记-对象的创建和访问

对象的创建过程当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作:检查常量池中是否有即将要创建的这个对象所属的类的符号引用;若常量池中没有这个类的符号引用,说...

sinat_27143551的博客 108

【JVM学习笔记】对象创建、直接内存与执行引擎

一、对象的创建 1 对象实例化的几种方式 2 从字节码角度看对象的创建 package com.spd.jvm; public class Test { public static void main(String[] args) { Object obj = new Object(); } }   对应字节码: 0 new #2 // 创建Object对象 3 dup // 复制一份栈顶slot并压入栈中 4 invokespecial #1 // 调用构造器方法 7 ast

qq_52247089的博客 211

JVM 对象创建内容学习笔记(《深入理解java虚拟机》之二 对象创建内容)

这部分看的时候手写了笔记,于是偷懒一下好了     P48,49的内容: 2.3.3 对象的访问定位 建立对象是为了使用对象,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于 reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定 位、访问堆中的对象的具体位置,所以对象访问方式也是取决于虚拟...

MGCTEL的博客 247

JVM学习笔记(一)内存区域,对象创建,对象内存布局

前置1、符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。 1)符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。 2)在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。2、直接引用:直接引用可以是 1)直接指向目标的指针(比如,指向"...

笨鸟的专栏 307

JVM学习笔记(七)对象创建过程(下)

PS:上半部分我们已经讲解了对象创建时机,以及类加载机制,这里我们继续上次没讲完的部分讲解。 java堆已有更详细的对象分配内存过程,这里大家可以看一下之前的博文,但我们还是简单的复习一下: Java堆对象分配内存 在类加载检查通过之后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务具体便等同于一块确定大小的内存从Java堆中划分出来。这时候...

qq_37692087的博客 359

JVM学习笔记八 之 对象创建和使用(对象生命周期系列)

一、对象创建 类型信息在装载、连接和初始化之后,就可以使用了,可以访问类型的静态字段和方法,可以创建类型实例。对象的创建分为现实创建和隐式创建两种。 显示创建分为:1、通过new创建;2、通过java.lang.Class的newInstance方法创建;3、通过clone方法创建;4、通过java.io.ObjectInputStream的readObject方法创建。 隐式创建...

田麦 170

深入理解JVM学习笔记(十五、对象的创建)

下图是JAVA虚拟机对象的创建过程: 现在我们就以下几点说明对象的创建: 1、给对象分配内存 给对象分配内存有指针碰撞和空闲列表两种方式。具体描述如下图所示。按时 2、线程安全性问题         无论是指针碰撞还是空闲列表,在高并发情况下都有可能存在线程安全性问题。解决方案如下:         1、加同步锁。                 安全但是执行效率低。     ...

张--小涛涛 267

性能调优-JVM对象创建与内存分配机制学习笔记

声明 本博客内容来源至图灵学院Java架构师课程,我写本博客的目的是为了方便自己复习和巩固自己的知识体系。纯碎是一个笔记的作用,涉及到侵权,请联系我删除。 对象的创建 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 new指令对应到语言层面上讲是,new关键字、对象克隆、对象序列化等。 分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对

Eistert 217

JVM面试速补:知识点梳理+学习路线+学习笔记+真题解析,够不够?

给大家介绍一本学习书籍**《Java虚拟机:JVM高级特性与最佳实践》454页的PDF,分为5个部分:走近java、启动内存管理机制、虚拟机执行子系统、程序编译与代码优化、高效并发。内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者 PC 指针的记录器等。注意注意:无论是下面分享的JVM知识点梳理,还是学习路线,学习笔记,或者真题解析,都可以免费分享出来跟大家一起学习,对象创建方法,对象的内存分配,对象的访问定位?好吧,下面来看看JVM的知识点梳理!

2401_89213320的博客 756
上一篇: 【JVM学习笔记】Java虚拟机内存管理
下一篇: 【JVM学习笔记】垃圾回收及算法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值