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

【Java基础】Java中new一个对象时,JVM到底做了什么?

Java中new一个对象时,JVM到底做了什么?

在Java编程中,new关键字是我们创建对象的最常用方式。但你是否想过,当你写下new MyClass()时,Java虚拟机(JVM)到底在背后做了哪些工作?今天,我们就来深入探讨一下new一个对象时,JVM的完整执行流程。


1. 类加载:对象的蓝图

当你第一次使用new创建一个对象时,JVM会首先检查这个类是否已经被加载。如果没有,JVM会通过类加载器(ClassLoader)加载该类的字节码文件(.class文件)。类加载的过程包括:

  • 加载:将类的字节码加载到内存中。
  • 验证:确保字节码是合法的,不会危害JVM的安全。
  • 准备:为类的静态变量分配内存并设置默认值。
  • 解析:将符号引用转换为直接引用。
  • 初始化:执行类的静态初始化块(static {})和静态变量的赋值操作。

类加载完成后,JVM就可以基于这个“蓝图”创建对象了。


2. 内存分配:为对象安家

类加载完成后,JVM会为对象在堆内存(Heap)中分配一块空间。这块空间的大小是由对象的成员变量决定的。例如,如果一个类有两个int类型的变量和一个String类型的变量,那么JVM会分配足够的内存来存储这些数据。

注意:Java的堆内存是所有线程共享的,因此内存分配需要考虑线程安全问题。JVM会通过指针碰撞(Bump the Pointer)或空闲列表(Free List)等机制来高效地分配内存。


3. 初始化默认值:清零操作

在内存分配完成后,JVM会将对象的成员变量初始化为默认值。这些默认值包括:

  • 数值类型(如intlongdouble等)的默认值为00.0
  • 布尔类型(boolean)的默认值为false
  • 引用类型(如StringObject等)的默认值为null

这一步确保了对象在构造函数执行之前,所有的成员变量都有一个已知的初始状态。


4. 执行构造代码块:对象的“热身”

如果类中定义了构造代码块(即在类中直接使用{}包裹的代码),JVM会在调用构造函数之前执行这些代码。构造代码块通常用于执行一些通用的初始化逻辑。

例如:

public class MyClass {{System.out.println("构造代码块执行");}
}

无论调用哪个构造函数,构造代码块都会被执行。


5. 调用构造函数:对象的“出生”

接下来,JVM会调用与new语句匹配的构造函数。构造函数的主要作用是对对象进行进一步的初始化。例如:

public class MyClass {private int value;public MyClass(int value) {this.value = value;System.out.println("构造函数执行");}
}

在构造函数中,你可以为成员变量赋值,或者调用其他方法来完成对象的初始化。


6. 返回引用:对象的“身份证”

当所有初始化操作完成后,new操作会返回对象在堆内存中的引用。这个引用实际上是一个指向堆内存中对象地址的指针。程序通过这个引用来操作对象。

例如:

MyClass obj = new MyClass(10);

这里的obj就是一个引用,它指向堆内存中MyClass对象的地址。


总结:new操作的完整流程

让我们用一个简单的例子来总结new一个对象时的完整流程:

public class MyClass {private int value;{System.out.println("构造代码块执行");}public MyClass(int value) {this.value = value;System.out.println("构造函数执行");}public static void main(String[] args) {MyClass obj = new MyClass(10);}
}

输出结果:

构造代码块执行
构造函数执行

从输出中可以看到,JVM首先执行了构造代码块,然后调用了构造函数。


思考:new操作的性能开销

虽然new操作看起来很简单,但它背后涉及了类加载、内存分配、初始化等多个步骤,这些操作都会带来一定的性能开销。因此,在高性能场景下,我们需要尽量避免频繁创建对象,或者使用对象池(Object Pool)等技术来优化性能。


结语

通过本文的讲解,相信你对Java中new一个对象时的完整流程有了更深入的理解。无论是类加载、内存分配,还是构造代码块和构造函数的执行,每一步都是JVM精心设计的。掌握这些底层细节,不仅能帮助你写出更高效的代码,还能让你在面试中脱颖而出。

如果你觉得这篇文章对你有帮助,欢迎点赞、转发,并在评论区分享你的看法!我们下期再见!


关注我,获取更多技术干货!

相关文章:

【Java基础】Java中new一个对象时,JVM到底做了什么?

Java中new一个对象时,JVM到底做了什么? 在Java编程中,new关键字是我们创建对象的最常用方式。但你是否想过,当你写下new MyClass()时,Java虚拟机(JVM)到底在背后做了哪些工作?今天&…...

C#中的字典怎么使用?

在C#中&#xff0c;Dictionary<TKey, TValue> 是一个泛型集合类&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。它提供了快速的查找、插入和删除操作&#xff0c;适合需要根据键快速查找值的场景。以下是 Dictionary 的基本用法和常见操作&#xf…...

vue框架后遗症∶被遗忘的dom操作

用多了vue、react等前端框架&#xff0c;不得不说用数据驱动视图来开发真的很香&#xff0c;但是也免不了会有不用这些框架的项目&#xff0c;dom操作还是很有必要的&#xff0c;一开始学习网页设计的时候就教过&#xff0c;后面一直开发项目基本上用框架。虽然有些想不起来了&…...

进程 ─── linux第10课

目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…...

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…...

MyBatis-Plus注解配置:@TableName、@TableId、@TableField

MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus 提供了一系列注解,用于简化数据库表与实体类之间的映射关系。以下是 @TableName、@TableId 和 @TableField 这三个常用注解的配置和使用说明。 官方文档:…...

DeepSeek接入问题-Xshell5连接Ubuntu22失败解决方案

项目场景&#xff1a; deepseek部署常用系统Ubuntu系统&#xff0c; xshell5连接Ubuntu22遇到如下问题&#xff1a; 问题描述 xshell5连接Ubuntu22遇到如下问题&#xff1a; Connecting to 172.16.46.80:22... Could not connect to 172.16.46.80 (port 22): Connection fa…...

论文阅读之基于Syn2Real域的侧扫声纳类水雷目标探测

摘要 由于现实世界数据的稀缺性&#xff0c;基于深度学习的水下水雷探测受到了限制。这种稀缺性导致过拟合&#xff0c;即模型在训练数据上表现良好&#xff0c;但在未见数据上表现不佳。本文提出了一种使用扩散模型的Syn2Real &#xff08;Synthetic to Real&#xff09;域泛…...

【Java】Tomcat日志

Tomcat日志 tomcat 日志的配置文件是tomcat目录下的/conf/logging.properties。 日志输出级别&#xff1a;SEVERE (最高级别) > WARNING > INFO > CONFIG > FINE > FINER(精心) > FINEST (所有内容,最低级别) 日志分类 tomcat 有五类日志 &#xff1a; …...

datalist 是什么?

一、datalist 是什么&#xff1f; datalist 是 HTML5 引入的一个表单相关元素&#xff0c;它本质上是一个为输入框&#xff08;<input>&#xff09;提供预定义选项列表的容器。从外观上看&#xff0c;当用户在与之关联的输入框中进行输入操作时&#xff0c;会自动弹出一个…...

初阶数据结构(C语言实现)——3顺序表和链表(3)

3.链表 3.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出&#xff0c;链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续…...

Docker 数据卷管理及优化

Docker 数据卷是一个可供容器使用的特殊目录&#xff0c;它绕过了容器的文件系统&#xff0c;直接将数据存储在宿主机上。通过数据卷&#xff0c;可以实现数据的持久化、共享以及独立于容器生命周期的管理。 1.1 为什么要用数据卷 Docker 分层文件系统的特点 性能差&#xff…...

Hi3516CV610车牌识别算法源码之——车牌识别算法初体验

本文讲述如何使用Hi3516CV610开发板读取本地图片&#xff0c;运行车牌识别算法推理&#xff0c;得到车牌信息并打印&#xff1b; 下一篇将介绍Hi3516CV610开发板如何从sensor摄像头获取图像&#xff0c;运行车牌识别算法推理&#xff0c;得到车牌信息并打印&#xff1b; 一、准…...

使用内置命令查看笔记本电池健康状态

如何使用powercfg /batteryreport命令查看笔记本电池健康状态 在Windows系统中&#xff0c;了解笔记本电池的健康状态对于维护电脑性能和预测电池寿命至关重要。Windows 10和Windows 11系统提供了一个内置命令powercfg /batteryreport&#xff0c;可以生成一份详细的电池使用情…...

HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统

适用型号&#xff1a;【BOD-WXX9】 MagicBook 15 2021款 i7 独显 MX450 16GB512GB (BDR-WFE9HN) MagicBook 15 2021款 i5 独显 MX450 16GB512GB (BDR-WFH9HN) MagicBook 15 2021款 i5 集显 16GB512GB (BDR-WFH9HN) 链接&#xff1a;https://pan.baidu.com/s/1S6L57ADS18fnJZ1…...

transformer架构的语言模型保存的内容与格式详解

前文我们已经详细讲述了基于pytorch框架下的transformer架构如何从零开始构建一个小型字符级语言模型,构建过程中涵盖数据准备、模型架构设计、训练、评估与生成的整个流程。我们已经了解了各个部分的细节,而且已经提供了完整的python代码。现在需要了解我们构建好的模型如何…...

win本地vscode通过代理远程链接linux服务器

时间&#xff1a;2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…...

【C++编程探索】01前缀和来临!优点多多!八千字详解

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 【PingdiGuo_guo&#xff1a;一名C、数据结构、算法等爱好者&#xff0c;用所学帮助大家&#xff0c;感谢关注&#xff01;】 新年刚过&#xff0c;在这里先祝各位 新年快乐&#xff01;&#xff01;&#xf…...

文件下载技术的终极选择:`<a>` 标签 vs File Saver.js

文件下载技术的终极选择&#xff1a;<a> 标签 vs File Saver.js 在 Web 开发中&#xff0c;文件下载看似简单&#xff0c;实则暗藏玄机。工作种常纠结于 <a> 标签的原生下载和 File Saver.js 等插件的灵活控制之间。本文将从原理、优缺点、场景对比到实战技巧&…...

《机器学习数学基础》补充资料:矩阵的LU分解

本文是对《机器学习数学基础》第2章2.3.3节矩阵LU分解的拓展。 判断是否可LU分解 并非所有矩阵都可以实现LU分解。 定理1&#xff1a; 若 n n n 阶可逆矩阵 A \pmb{A} A 可以进行LU分解&#xff0c;则 A \pmb{A} A 的 k k k 阶顺序主子阵&#xff08;leading principal s…...

VMware16虚拟机扩容实战:Ubuntu22.04磁盘空间不足的终极解决方案

VMware16虚拟机扩容实战&#xff1a;Ubuntu22.04磁盘空间不足的终极解决方案 当你全神贯注地在Ubuntu22.04虚拟环境中开发项目时&#xff0c;突然弹出的"磁盘空间不足"警告足以让任何开发者心头一紧。特别是在使用VMware16这类虚拟化平台时&#xff0c;初始分配的磁盘…...

效率飞跃:利用快马AI生成智能预标注脚本,让你的labelimg标注速度提升数倍

在图像标注领域&#xff0c;手动标注大量图片一直是个耗时费力的工作。最近我在尝试用AI辅助标注时&#xff0c;发现通过InsCode(快马)平台可以快速实现一个智能预标注工具&#xff0c;让标注效率提升数倍。下面分享我的实践过程和经验总结。 项目背景与痛点分析 传统使用label…...

lite-avatar形象库实用技巧:如何通过形象ID精准定位职业特征数字人

lite-avatar形象库实用技巧&#xff1a;如何通过形象ID精准定位职业特征数字人 在数字人应用开发中&#xff0c;找到一张符合特定职业、气质和场景需求的“脸”&#xff0c;往往是项目启动的第一个难题。是让设计师花几天时间手绘&#xff0c;还是用通用模型生成一个风格模糊的…...

互关,互三,互相学习[特殊字符]

来互关...

lingbot-depth-vitl14工业质检案例:玻璃瓶透明表面深度补全前后PSNR对比分析

lingbot-depth-vitl14工业质检案例&#xff1a;玻璃瓶透明表面深度补全前后PSNR对比分析 1. 引言&#xff1a;当工业质检遇上透明表面 在工业自动化生产线上&#xff0c;玻璃瓶、透明塑料件这类产品的质检一直是个头疼的问题。传统的视觉检测系统&#xff0c;面对透明或半透明…...

MEMS加速度计:从原理到智能设备的创新应用

1. MEMS加速度计&#xff1a;小身材大能量的传感器 你可能每天都在用MEMS加速度计&#xff0c;只是自己不知道。当你把手机横过来看视频时屏幕自动旋转&#xff0c;或者戴着智能手表记录步数时&#xff0c;背后都是这个小东西在默默工作。MEMS加速度计全称是微机电系统加速度计…...

Phi-3 Forest Lab应用场景:数据工程师——SQL转Pandas+异常检测逻辑生成

Phi-3 Forest Lab应用场景&#xff1a;数据工程师——SQL转Pandas异常检测逻辑生成 1. 数据工程师的日常痛点 数据工程师每天都要处理大量数据转换和分析任务&#xff0c;其中两个最常见的工作是&#xff1a; SQL到Pandas的转换&#xff1a;需要将业务团队提供的SQL查询转换…...

什么是技术性SEO,如何进行优化_如何优化网站的页面标题(title)

什么是技术性SEO 在数字营销领域&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是提高网站在搜索引擎结果页面&#xff08;SERP&#xff09;中排名的关键技术。SEO主要分为技术性SEO和内容性SEO两大类。技术性SEO是指通过优化网站的技术结构和性能&#xff0c;提升搜索…...

从零手写VSCODE 配置文件

VSCODE 配置文件书写详解 一.task.json 决定文件怎么编译,本质就是在指定的type下不断重复执行command和args构成的命令 1.基本框架 {"version":"2.0.0",//固定版本号"tasks":[ //任务数组,可以定义多个任务 {//任务一},{//任务二}],"i…...

OpenClaw语音转写方案:千问3.5-9B处理会议录音与摘要

OpenClaw语音转写方案&#xff1a;千问3.5-9B处理会议录音与摘要 1. 为什么需要本地化的语音处理方案 上个月我连续参加了三场跨时区技术会议&#xff0c;每次会后都要花两小时整理录音和纪要。尝试过主流语音转写工具后&#xff0c;发现两个痛点&#xff1a;一是敏感技术术语…...