一、创建对象的完整过程

 1. 类加载检查

  • JVM 遇到 new 指令时,首先去检查这个类 User 是否已经被加载、解析和初始化过。

  • 如果没有,就先执行 类加载过程(加载 .class 文件到方法区/元空间、创建 Class 对象等)。【这个过程就是加载、验证、准备、解析、初始化


 2. 分配内存

  • JVM 在 堆(Heap) 中为新对象分配内存。

  • 分配方式可能是:

    • 指针碰撞(bump-the-pointer):堆内存规整时,用一个指针往后挪就能完成分配。

    • 空闲列表(free-list):堆内存不规整时,需要维护可用内存块列表来找到一块合适的空间。


 3. 内存初始化(零值初始化)

  • 对分配到的内存空间进行 零值初始化,保证对象的实例字段有默认值。

  • 比如:int0Objectnullbooleanfalse

  • 这样保证 Java 程序不读到脏数据。


 4.  设置对象头

  • JVM 会在对象头中写入信息:

    • 哈希码(可能延迟计算)

    • GC 分代年龄

    • 类的元数据指针(指向方法区中的 Class 对象)

    • 锁信息(偏向锁/轻量级锁/重量级锁)


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

  • new 指令会执行对象的构造函数,真正完成对象的初始化。

  • 先执行父类构造方法,再执行子类构造方法。

  • 至此,字段会被赋予程序员写的初始化值(而不是零值)。


 6. 返回对象引用

  • new 指令执行完毕后,返回对象在堆中的引用地址。

  • user 变量存放的是这个对象的 引用(指针),而不是对象本身。


二、简化流程图

new -> 类加载检查 -> 分配内存 -> 零值初始化 -> 设置对象头 -> 调用构造函数 <init> -> 返回引用

三、额外说明

  1. 栈 vs 堆

    • 对象本身存放在堆里;

    • 引用变量(比如 user)在栈帧的局部变量表里,存放堆中对象的地址。

  2. 优化:TLAB(Thread Local Allocation Buffer)

    • 多线程环境下,为了避免内存分配加锁,JVM 会给每个线程分配一小块内存(TLAB)。

    • 绝大多数对象都能在 TLAB 上直接分配,效率非常高。

  3. 逃逸分析 & 栈上分配

    • JIT 优化时,如果发现对象不会逃出方法范围,可以直接在 上分配,而不是堆。

    • 这样方法执行完对象就回收,不需要 GC。


总结一句话:
Java 创建对象的过程是:
类加载检查 → 堆内存分配 → 零值初始化 → 设置对象头 → 调用构造函数 → 返回引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97569.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97569.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97569.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Web安全】CRLF注入攻击深度解析:原理、场景与安全测试防御指南

文章目录前言&#xff1a;为什么CRLF注入是安全测试不可忽视的威胁&#xff1f;1. CRLF注入核心原理&#xff1a;从字符定义到协议依赖1.1 什么是CRLF&#xff1f;1.2 CRLF在HTTP协议中的关键作用1.3 CRLF注入的本质&#xff1a;格式混淆攻击2. CRLF注入典型利用场景与安全测试…

【安全学习】DVWA 靶场 SQL 注入漏洞原理分析与防御策略(教育用途)

注意&#xff1a;本文内容仅用于合法授权的安全研究、教学演示及漏洞复现&#xff0c;严禁用于任何未授权的系统或网络环境。 所有操作需在本地沙箱或个人可控靶场中执行&#xff0c;切勿对生产环境、他人系统进行测试&#xff0c;非法使用后果自负。&#x1f4cc; 法律与道德双…

Langflow Memory 技术深度分析

Langflow Memory 技术深度分析 1. Memory 技术概述和设计理念 1.1 技术概述 Langflow 的 Memory 系统是一个多层次的记忆管理框架&#xff0c;专门设计用于处理对话历史、上下文状态和会话数据的存储与检索。该系统采用了分层架构设计&#xff0c;支持多种记忆类型和存储后端&a…

从0开始搭建一个前端项目(vue + vite + less + typescript)

版本 node&#xff1a;v22.17.1 pnpm&#xff1a;v10.13.1 vue&#xff1a;^3.5.18 vite&#xff1a;^7.0.6 typescipt&#xff1a;~5.8.0脚手架初始化vue pnpm create vuelatest只选择&#xff1a; TypeScript, JSX 3. 用vscode打开创建的项目&#xff0c;并删除多余的代码esl…

(十)ps识别:Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型训练过程解析

Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型 思路分析模型融合思路&#xff1a; 利用ResNet50提取图像的局部纹理和边缘特征&#xff0c;这对检测篡改区域的细微变化非常重要利用Swin Transformer-T捕捉全局上下文信息和长距离依赖关系&#xff0c;有助于理解图像整…

[ICCV25]TRACE:用3D高斯直接学习物理参数,让AI“推演”未来场景

导读在复杂的动态世界中&#xff0c;让机器人既能看懂场景&#xff0c;又能预测未来变化&#xff0c;是一项极具挑战性的任务。过去的方法往往依赖人工标注或简化的物理模型&#xff0c;却难以真正捕捉物体运动的规律。TRACE 提出了一个全新的思路&#xff1a;把三维场景中的每…

电商数据开发实践:深度剖析1688商品详情 API 的技术与应用

在电商行业数字化转型的进程中&#xff0c;数据获取与处理的效率和准确性&#xff0c;直接影响着企业的竞争力。作为开发者&#xff0c;相信大家都遇到过这类棘手问题&#xff1a;在构建时&#xff0c;因数据不一致导致采购决策失误&#xff1b;使用传统&#xff0c;又常遭遇电…

Docker 详解+示例(部署Kafka镜像容器)

介 绍Docker 是一个开源的容器化平台&#xff0c;它的核心目标是解决 “软件在不同环境下运行不一致” 的问题&#xff0c;实现 “一次构建&#xff0c;到处运行” 。它基于 Linux 内核的底层技术&#xff0c;将应用程序及其依赖&#xff08;如库文件、配置、运行环境等&#x…

SciPy科学计算与应用:SciPy应用实战-数据分析与工程计算

SciPy案例研究&#xff1a;从理论到实践 学习目标 通过本课程&#xff0c;学员将了解一系列实际案例&#xff0c;深入探讨SciPy库在数据分析、物理模拟和工程计算中的应用。同时学员将学习如何利用SciPy解决实际问题&#xff0c;加深对SciPy各个模块的理解和应用能力。 相关知识…

React学习教程,从入门到精通, ReactJS - 架构(6)

ReactJS - 架构 React应用的架构 React的架构就像一个井然有序的厨房&#xff0c;每个工具都有其特定的位置和用途。在其核心&#xff0c;React遵循一个基于组件的架构&#xff0c;这意味着我们使用可重用的组件构建应用程序。 组件&#xff1a;构建块 可以把组件想象成乐高积木…

Bias / variance and neural networks|偏差/方差和神经网络

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

Linux HMM(Heterogeneous Memory Management)的应用

原理篇见【https://blog.csdn.net/shenjunpeng/article/details/150931847?spm1011.2415.3001.5331】 1. HMM 的优势与挑战 1.1 优势 统一虚拟地址空间&#xff1a;简化异构计算平台的数据共享和访问。 高效页表同步&#xff1a;支持设备端的 page fault 和页表同步&#x…

鸿蒙创新赛活动——Mac提交压缩失败后续

Mac提交压缩失败后续来了… 传送带【上一篇】 背景 华为2025HarmonyOS创新赛 上传作品的时候&#xff0c;遇到了一个提示 ZIP包中的Office文件含有嵌入文件&#xff0c;就去这个Office文件找&#xff0c;怎么也找不到嵌入的文件。 解决方法1 上次推荐的解决方式是&#xff0…

Ubuntu操作系统下使用mysql、mongodb、redis

目录 一、核心步骤概览 二. MySQL &#xff08;下面以其他用户为例&#xff09; 1,、安装 2、管理服务 3、连接与使用 4、配置文件位置 5、下面来演示一下安装好之后如何在Linux操作系统中远程登录和window互连Linux 远程登录 window连Linux&#xff08;连不上的&…

springboot java开发的rocketmq 顺序消息保证

首先要明确一个关键点&#xff1a;RocketMQ 保证的是一种局部顺序&#xff08;Partially Ordered&#xff09;​&#xff0c;而非全局顺序&#xff08;Globally Ordered&#xff09;。这意味着消息的顺序性只在某个特定维度&#xff08;比如同一个订单ID&#xff09;下保证&…

【机器学习】 14 Kernels

本章目录 14 Kernels 479 14.1 Introduction 479 14.2 Kernel functions 479 14.2.1 RBF kernels 480 14.2.2 Kernels for comparing documents 480 14.2.3 Mercer (positive definite) kernels 481 14.2.4 Linear kernels 482 14.2.5 Matern kernels 482 14.2.6 String kerne…

Android开发-工程结构

一、项目视图模式在开始之前&#xff0c;确保你的 Project 面板使用的是 【Android】 视图&#xff08;默认&#xff09;。这是最常用的视图&#xff0c;它将相关文件按功能逻辑分组展示。&#x1f4a1; 你也可以切换到 【Project】 视图查看完整的文件系统结构。二、顶级项目结…

mysql的内置函数

文章目录mysql的内置函数时间函数1. 返回值的数据类型和格式2. 功能侧重点3. 函数别名情况我现在想给一个日期加上十天&#xff0c;然后输出加上十天之后的日期&#xff0c;我该怎么做&#xff1f;我现在想给一个日期减去两天&#xff0c;然后输出减去两天之后的日期&#xff0…

【动态规划】子序列问题

一、[最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/description/)二、[摆动序列](https://leetcode.cn/problems/wiggle-subsequence/description/)三、[最长递增子序列的个数](https://leetcode.cn/problems/number-of-longest-increasing-s…

P2P技术应用:去中心化

P2P技术应用&#xff1a;https://www.bilibili.com/video/BV1WH4y1Y7i9 P2P与下载器 P2P技术实现的下载协议&#xff1a; 1、种子文件 2、磁力 3、电骡 播放器&#xff1a; 快车、电骡、迅雷 BT&#xff08;种子&#xff09;下载的基本技术原理 网盘与P2P技术 网盘公司的主…