当前位置: 首页 > news >正文

对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?

在Java中,对象的创建方式及其在虚拟机中的具体过程如下:


一、对象的创建方式

  1. 使用 new 关键字
    最常见的对象创建方式,直接调用类的构造方法。

    MyClass obj = new MyClass();
    
  2. 反射(Reflection)
    通过 ClassConstructor 对象动态创建实例。

    // 使用Class.newInstance()(已废弃)
    MyClass obj = MyClass.class.newInstance();// 使用Constructor.newInstance()
    Constructor<MyClass> constructor = MyClass.class.getConstructor();
    MyClass obj = constructor.newInstance();
    
  3. 克隆(Clone)
    实现 Cloneable 接口,通过 clone() 方法复制现有对象。

    MyClass original = new MyClass();
    MyClass clone = (MyClass) original.clone();
    
  4. 反序列化(Deserialization)
    通过反序列化字节流恢复对象,不会调用构造方法。

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
    MyClass obj = (MyClass) in.readObject();
    
  5. 工厂方法(Factory Method)
    通过静态方法返回对象实例,隐藏构造细节。

    public class MyClass {public static MyClass create() {return new MyClass();}
    }
    MyClass obj = MyClass.create();
    
  6. Unsafe 类(不推荐)
    绕过构造方法直接分配内存(需谨慎使用)。

    MyClass obj = (MyClass) Unsafe.getUnsafe().allocateInstance(MyClass.class);
    

二、虚拟机中的对象创建过程

当 JVM 遇到 new 指令时,会按以下步骤创建对象:

1. 类加载检查

检查类是否已加载
若类未被加载,触发类加载过程(加载 → 验证 → 准备 → 解析 → 初始化)。

2. 内存分配

分配堆内存:根据对象的类型和大小,在堆中分配空间。
分配方式
| 方式 | 适用场景 | 实现 |
|---------------------|-----------------------------------------|----------------------------------------|
| 指针碰撞(Bump the Pointer) | 堆内存规整(如Serial、ParNew等带压缩的GC) | 通过移动指针分配连续内存。 |
| 空闲列表(Free List) | 堆内存不规整(如CMS) | 维护空闲内存块列表,从列表中分配。 |

TLAB(Thread Local Allocation Buffer)
为每个线程在堆中预先分配一小块内存(默认1%),避免多线程竞争,提升分配效率。

3. 内存空间初始化

零值初始化:将对象的实例变量初始化为默认值(如 int0,引用 → null)。

4. 设置对象头(Object Header)

对象头包含以下信息:
Mark Word:哈希码、GC分代年龄、锁状态标志等(32位/64位结构不同)。
类型指针:指向类元数据的指针(用于确定对象类型)。
数组长度(仅数组对象):记录数组长度。

5. 执行构造方法(<init>

实例变量初始化:执行代码中的显式赋值(如 private int x = 5;)。
构造代码块:执行 {} 中的代码。
构造函数:执行用户定义的构造方法(如 public MyClass() { ... })。


三、不同创建方式的虚拟机处理差异

创建方式内存分配零值初始化对象头设置执行构造方法
new 关键字
反射(Constructor)
克隆(Clone)❌(复制原值)
反序列化❌(恢复原值)
Unsafe.allocateInstance

四、关键点总结

内存分配策略:指针碰撞(规整堆) vs. 空闲列表(碎片化堆)。
TLAB 优化:减少多线程竞争,提升分配效率。
对象头作用:存储元数据(如锁状态、GC信息),支持运行时类型检查。
构造方法执行:对象创建的最后一步,完成用户定义的初始化逻辑。

理解这些机制有助于优化代码性能(如合理使用对象池)和排查内存问题(如对象头损坏导致的锁异常)。

相关文章:

对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?

在Java中&#xff0c;对象的创建方式及其在虚拟机中的具体过程如下&#xff1a; 一、对象的创建方式 使用 new 关键字 最常见的对象创建方式&#xff0c;直接调用类的构造方法。 MyClass obj new MyClass();反射&#xff08;Reflection&#xff09; 通过 Class 或 Constructor…...

openwrt软路由配置3

1.启用sftp文件连接 使用ssh连接openwrt时&#xff0c;我发现无法打开sftp windows进行上传和下载文件&#xff0c;提示 sftp channel closed by server: stderr:ash /usr/libexec/sftp-server:not found 原因是系统刚刚装好后&#xff0c;没有安装openssh-sftp-server包 opk…...

C语言for循环嵌套if相关题目

一、题目引入 以下代码程序运行结果是多少? 二、思路解析 进入一个for循环 a<100 进入第一个if b1不大于20为假 进入第二个if b4 a这时a自增为2 当b4时,满足第二个if条件 1.b4,a2 当b7时,满足第二个if条件 2.bb37,a3 当b10时,满足第二个if条件 …...

Redis与Mysql双写一致性如何保证?

我们在面试的时候redis与mysql双写一致性是一个常考的问题&#xff0c;今天我们就一起探讨一下吧 所谓的一致性就是数据的一致性&#xff0c;在分布式系统中&#xff0c;可以理解为多个节点中数据的值是一致的。 强一致性&#xff1a; 这种一致性级别是最符合用户直觉的&…...

STM32 CRC校验与芯片ID应用全解析:从原理到实践 | 零基础入门STM32第九十七步

主题内容教学目的/扩展视频CRC与芯片ID原理实现CRC校验和读取芯片ID为单片机应用提供数据验证和身份识别的功能。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、CRC校验功能解析1.1 CRC基本原理1.2 核心功能对比 二、CRC校验应用实战2.1 典型应用场景2.2 程序实…...

《微服务与事件驱动架构》读书分享

《微服务与事件驱动架构》读书分享 Building Event-Driver Microservices 英文原版由 OReilly Media, Inc. 出版&#xff0c;2020 作者&#xff1a;[加] 亚当 • 贝勒马尔 译者&#xff1a;温正东 作者简介&#xff1a; 这本书由亚当贝勒马尔&#xff08;Adam Bellemare…...

⼤模型(LLMs)基础

⼤模型&#xff08;LLMs&#xff09;基础 ⽬前 主流的开源模型体系 有哪些&#xff1f;prefix Decoder 和 causal Decoder 和 Encoder-Decoder 区别是什么&#xff1f;⼤模型LLM的 训练⽬标 是什么&#xff1f;涌现能⼒是啥原因&#xff1f;为何现在的⼤模型⼤部分是Decoder o…...

IDEA :物联网ThingsBoard-gateway配置,运行Python版本,连接thingsboard,接入 MQTT 设备

准备阶段&#xff08;教程只针对本地操作&#xff0c;未涉及虚拟机环境&#xff09; Thingsboard源码编译并运行 没有操作过的小伙伴&#xff0c;可以看我上一篇文章 物联网ThingsBoard源码本地编译篇&#xff0c;超详细教程&#xff0c;小白看过来&#xff01;_thingsboard…...

面向大模型的开发框架LangChain

这篇文章会带给你 如何使用 LangChain&#xff1a;一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档&#xff08;以 Python 版为例&#xff09;模型 I/O 封装…...

每日算法:洛谷U535992 J-C 小梦的宝石收集(双指针、二分)

题目描述 小梦有 n 颗能量宝石&#xff0c;其中第 i 颗的能量为 ai​&#xff0c;但这些能量宝石十分不稳定&#xff0c;随时有可能发生崩坏&#xff0c;导致他们全部消失&#xff01; 小梦想要留住宝石们&#xff0c;不希望他们发生崩坏&#xff0c;同时他发现&#xff1a;如…...

写给新人的深度学习扫盲贴:ReLu和梯度

一、ReLU&#xff08;Rectified Linear Unit&#xff0c;修正线性单元&#xff09; 梯度是深度学习中最常用的激活函数之一&#xff0c;因其简单、高效且能有效缓解梯度消失问题而被广泛使用。 1. 数学定义 函数表达式&#xff1a; $$ \text{ReLU}(x) \max(0, x) \begin{…...

Spring 框架的核心基础:IoC 和 AOP

一、IoC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 定义&#xff1a; IoC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;&#xff0c;就是把对象创建和依赖关系的管理交给 Spring 容器&#xff0c;而不是由程序员手动去创建对象…...

JavaScript逆向工程实战:如何精准定位加密参数生成位置

前言&#xff1a;一个令人困惑的调试案例 最近在进行某网站的JavaScript逆向分析时&#xff0c;我遇到了一个有趣的现象&#xff1a;当我尝试定位一个名为m的加密参数&#xff08;值为MTIwMTE3NDQxODk1NTY1NjkA这样的Base64字符串&#xff09;时&#xff0c;调试器却带我来到了…...

SSM智能停车场管理系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 SS…...

[定位器]晶艺LA1823,4.5V~100V, 3.5A,替换MP9487,MP9486A,启烨科技

Features  4.5V to 100V Wide Input Range  3.5A Typical Peak Current Limit  Integrated 500mΩ low resistance high side power MOS.  Constant On Time Control with Constant Switching Frequency.  180μA Low Quiescent Current  150kHz/240kHz/420kHz Swi…...

天元证券|A股大反攻!北证50涨超10%!芯片股大爆发

今日&#xff0c;A股全线走强。 科技成长股领涨&#xff0c;北证50指数飙升逾10%&#xff0c;科创50也大涨超4%&#xff0c;深证成指、上证指数午后也稳步拉升涨逾1%。值得注意的是&#xff0c;上证50指数临近收盘集合竞价的时候直线拉升。近4600只个股上涨&#xff0c;成交稳步…...

利用python从零实现Byte Pair Encoding(BPE):NLP 中的“变形金刚”

BPE&#xff1a;NLP 界的“变形金刚”&#xff0c;从零开始的奇幻之旅 在自然语言处理&#xff08;NLP&#xff09;的世界里&#xff0c;有一个古老而神秘的传说&#xff0c;讲述着一种强大的魔法——Byte Pair Encoding&#xff08;BPE&#xff09;。它能够将普通的文本“变形…...

最新Web系统全面测试指南

你有没有遇到过这样的情况&#xff1a; 系统上线当天&#xff0c;用户频频报错&#xff0c;运维一脸懵逼&#xff0c;开发说“我本地没问题”&#xff1f; 你明明写了几十个测试用例&#xff0c;结果却还是有 Bug 漏网&#xff1f; Web 系统测试&#xff0c;不只是点点点&#…...

OpenBMC:BmcWeb 处理http请求6 调用路由处理函数

OpenBMC:BmcWeb 处理http请求5 检查权限-CSDN博客 检查完权限后,调用了rule.handle(*req, asyncResp, params); template <typename... Args> class TaggedRule :public BaseRule,public RuleParameterTraits<TaggedRule<Args...>> {void handle(const Req…...

售货机管理系统:智慧零售时代的运营新引擎

一、引言 在快节奏的都市生活中,自动售货机已成为便捷消费的重要场景。然而,传统售货机依赖人工补货、手工对账,常面临库存失衡、设备故障发现滞后、数据孤岛等痛点。如何突破效率瓶颈?本文将深入剖析榕壹云售货机管理系统的项目背景、客户定位、技术与核心功能、系统优势…...

Python基础全解析:从输入输出到字符编码的深度探索

一、Python程序交互的基石&#xff1a;Print函数详解 1.1 基础输出功能 # 输出数字 print(20.5) # 输出浮点数&#xff1a;20.5 print(0b0010) # 输出二进制数&#xff1a;10# 输出字符串 print(Hello World!) # 经典输出示例# 表达式计算 print(4 4 * (2-1)…...

Python第八章02:数据可视化Pyecharts包无法使用

PS:本节纯属个人在学习过程中遇到问题、解决问题的经验分享&#xff0c;对学习进度没影响&#xff0c;没有遇到该问题的小伙伴可跳过。 首先&#xff0c;在学习数据图形化过程中&#xff0c;通过命令提示符安装了Pyecharts包&#xff0c;在命令提示符中验证安装成功。 在PyChar…...

【人工智能】如何通过精准提示工程实现完美的珠宝首饰展示

AI艺术创作指南&#xff1a;如何通过精准提示工程实现完美的珠宝首饰展示 引言&#xff1a;认知边界的突破 在AI艺术创作的漫长探索中&#xff0c;许多创作者面临着相似的困扰&#xff1a;当他们看到别人能够通过算法编织出如同文艺复兴时期细腻油画般的奢华珠宝展示图&#…...

Redis学习总结(持续更新)

Redis 目前在学习redis&#xff0c;遇到的一些问题会放在这里&#xff0c;加深自己的印象。 1. Redis缓存相较于传统Session存储的特点 Session的存储方式&#xff1a; 通常&#xff0c;传统的Session是存储在应用服务器的内存中&#xff0c;比如Tomcat的Session管理器。用户…...

RabbitMQ从入门到实战-3(高可靠性)

文章目录 发送者可靠性发送者重连发送者确认&#xff08;一般不会开启&#xff09;指定returncallback和confrimfallbacktips MQ可靠性数据持久化LazyQueue&#xff08;默认模式且不可更改&#xff09; 消费者的可靠性消费者确认机制消费者失败重试业务幂等性唯一消息id业务判断…...

RTK 实时动态定位概述

01 引言 RTK(实时动态定位,Real-Time Kinematic)是一种高精度的卫星导航定位技术,通过差分校正方法,将GNSS(全球导航卫星系统)的定位精度从米级提升至厘米级(通常1-3厘米),广泛应用于测绘、无人机、自动驾驶、精准农业等领域。 02 概述 1. RTK的基本原理 RTK的核…...

Conda 环境离线迁移实战:解决生产环境网络限制的高效方案20250409

Conda 环境离线迁移实战&#xff1a;解决生产环境网络限制的高效方案 在生产环境无法联网的前提下&#xff0c;如何高效、安全地部署 Python 虚拟环境&#xff0c;是许多企业在实际运维中必须面对的问题。特别是当前常见的开发环境基于 Miniconda&#xff0c;生产环境使用 Ana…...

dify使用知识库

注意 要用向量模型 导入文件 选择向量模型 要下载好后&#xff0c;才可以导入模型&#xff0c; 这个模型没法在ollama中run 聊天工具添加知识库 效果...

HTTP:一.概述

http是干嘛的? 超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统…...

Appium工作原理及环境的搭建(1)

1、Appium的介绍&#xff1a; 一、什么是Appium Desktop&#xff1f; Appium Desktop是Appium项目的桌面版GUI工具&#xff0c;提供了一个友好的界面&#xff0c;用于启动Appium服务器、查看设备日志、与设备交互、调试自动化脚本等。相比于命令行工具&#xff0c;Appium Des…...

Interactron: Embodied Adaptive Object Detection(训练时进行更新参数) 还没看懂

Interactron: Embodied Adaptive Object Detection 创新点 这些方法通常存在两个主要的共同假设。第一&#xff0c;模型在固定的训练集上进行训练&#xff0c;并在预先录制的测试集上进行评估。第二&#xff0c;模型在训练阶段结束后保持冻结状态&#xff0c;即训练完成后不再…...

【Pandas】pandas DataFrame copy

Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…...

Redis基础指令(Windows)

1.cmd命令行启动redis 直接cmd打开整个文件 1.1.启动server 输入指令&#xff1a; redis-server.exe redis.windows.conf 会进入serve端 1.2.启动客户端 &#xff01;&#xff01;重新打开一个cmd&#xff0c;方法和上面一样&#xff01;&#xff01; 之后输入 redis-…...

MV-DLS600P激光振镜立体相机(MV-DLS600P)重要参数解析

功能特性 采用激光振镜技术&#xff0c;亚毫米级图像采集精度 高能效激光模块配合精准曝光同步&#xff0c;性能更稳定 支持多帧融合&#xff0c;无惧金属工件表面反光干扰 支持RGB、深度图同步对齐输出&#xff0c;便于二次开发 配备窄带滤光片&#xff0c;抗干扰能力更强&…...

C语言【输出字符串中的大写字母】

题目 输出字符串中的大写字母 思路&#xff08;注意事项&#xff09; 纯代码 #include<stdio.h> #include<string.h>int main(){char str[20], ans[20];fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] \0;for (int i 0, j 0; i < strl…...

UniApp基于xe-upload实现文件上传组件

xe-upload地址&#xff1a;文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 致敬开发者&#xff01;&#xff01;&#xff01; 感觉好用的话&#xff0c;给xe-upload的作者一个好评 背景&#xff1a;开发中经常会有…...

deque容器

1.定义 也叫双端数组&#xff0c;可以对头部进行插入和删除。 2.与vector区别 3.内部工作原理 他是把整个地址划分成多块小地址&#xff08;缓冲区&#xff09;&#xff0c;然后有一个中控区去记录这些地址&#xff0c;然后访问的时候先通过中控区然后再转到相应的缓冲区&am…...

git 总结遇到的问题

git Push 报错 Push failed send-pack: unexpected disconnect while reading sideband packet Total 2269 (delta 418), reused 0 (delta 0), pack-reused 0 the remote end hung up unexpectedly 解决方案&#xff1a;增加 Git 的缓冲区&#xff0c;有时由于数据量大或网络…...

python基础语法11-文件读写

在 Python 中&#xff0c;文件操作是日常编程中的常见任务之一。Python 提供了简单且强大的工具来读取和写入文件。通过使用内置的 open() 函数、read()、readline()、write() 等方法&#xff0c;我们可以轻松实现对文件的操作。此外&#xff0c;Python 的 with 语句可以帮助我…...

Webstorm 使用搜不到node_modules下的JS内容 TS项目按Ctrl无法跳转到函数实现

将node_modules标记为不排除&#xff0c;此时要把内存改大&#xff0c;不然webstorm中途建立索引时&#xff0c;会因为内存不足&#xff0c;导致索引中途停止&#xff0c;造成后续搜索不出来 更改使用内存设置 内存调为4096 若出现搜不出来js内容时&#xff0c;请直接重启下该项…...

转行嵌入式,需要自学多久?

作为一个本硕都学机械&#xff0c;却阴差阳错进入嵌入式行业的老兵&#xff0c;这个问题我能聊一整天。十几年前我还在工厂车间穿着工装和机床打交道&#xff0c;偶然接触到单片机后就一发不可收拾。 转行这条路我走得异常艰辛&#xff0c;踩过的坑比写过的代码还多。去年我终…...

BLE 协议栈事件驱动机制详解

在 BlueNRG-LP 等 BLE 系统中,事件驱动是控制状态转移、数据交互和外设协作的基础。本文将深入讲解 BLE 协议栈中事件的来源、分发流程、处理结构与实际工程实践策略,帮助你构建稳定、可维护的 BLE 系统。 📦 一、BLE 事件的来源分类 BLE 协议栈中的事件严格来自协议栈本身…...

AI开发学习路线(闯关升级版)

以下是一份轻松版AI开发学习路线&#xff0c;用「闯关升级」的方式帮你从零开始变身AI开发者&#xff0c;每个阶段都配有有趣的任务和实用资源&#xff0c;保证不枯燥、可落地&#xff01;&#x1f447; 目录 &#x1f530; 新手村&#xff1a;打基础&#xff08;1-2个月&…...

突破,未观测地区罕见极端降雨的估计

文章中文总结&#xff08;重点为方法细节&#xff09; 一、研究背景与目的 在无测站或短观测记录地区&#xff0c;传统极值理论&#xff08;如GEV&#xff09;难以估计稀有极端降雨事件&#xff1b;本文提出一种新的区域化极值估计方法&#xff1a;区域化 Metastatistical Ex…...

zk源码—4.会话的实现原理一

大纲 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建 (3)会话ID的初始化实现 (4)设置的会话超时时间没生效的原因 2.分桶策略和会话管理 (1)分桶策略和过期队列 (2)会话激活 (3)会话超时检查 (4)会话清理 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建…...

快排算法 (分治实现)

本算法采用将整个数组划分成三个部分 <key key >key 在数组全是同一个数字时&#xff0c;也能达到NlogN的时间复杂度 下面的板书中i为遍历数组的下标 left为<key的最右边的下标 right为>key的最左边的下标 例题1&#xff1a;912. 排序数组 - 力扣&#xff0…...

P9242 [蓝桥杯 2023 省 B] 接龙数列

这道题说要求最少删多少个使剩下的序列是接龙序列&#xff0c;这个问题可以转换为序列中最长的接龙序列是多少&#xff0c;然后用总长度减去最长接龙序列的长度就可以了&#xff0c;在第一个暴力版本的代码中我用了两个for循环求出了所有的接龙序列的长度&#xff0c;但是会超时…...

未来 AI 发展趋势与挑战(AGI、数据安全、监管政策)

从 ChatGPT 的火爆到国内 DeepSeek、通义千问、百川智能等模型的兴起,AI 正以前所未有的速度走入各行各业。而下一阶段,AI 是否会发展出真正的“通用智能”(AGI)?数据隐私、技术伦理又该如何应对?本文将带你全面洞察未来 AI 的技术趋势与落地挑战。 一、AGI 的曙光:通用…...

驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 从静态绑定驱动模型到现代设备模型 主题&#xff1a;深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比 在上一节中&#xff0c;我们从驱动框架的历史演进出…...

MyBatis 动态 SQL 使用详解

&#x1f31f; 一、什么是动态 SQL&#xff1f; 动态 SQL 是指根据传入参数&#xff0c;动态拼接生成 SQL 语句&#xff0c;不需要写多个 SQL 方法。MyBatis 提供了 <if>、<choose>、<foreach>、<where> 等标签来实现这类操作 ✅ 二、动态 SQL 的优点…...