面試tips--JVM(2)--對象創建的過程

一、創建對象的完整過程

?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技術 網盤公司的主…