【Hotspot虛擬機創建對象的過程是什么樣的?】

1. 類加載檢查
  • 觸發條件:當遇到 new 指令時,JVM首先檢查該指令的參數(類符號引用)是否已在常量池中。
  • 檢查內容
    • 類是否已被加載、解析和初始化。
    • 若未加載,則觸發類加載過程(加載 → 驗證 → 準備 → 解析 → 初始化)。
  • 目的:確保類元數據可用,避免后續操作因類未定義而失敗。

2. 內存分配
  • 分配方式
    • 指針碰撞(Bump the Pointer):適用于內存規整的堆(如Serial、ParNew收集器)。
      通過移動指針劃分內存,分配速度快(僅需指針移動)。
    • 空閑列表(Free List):適用于內存不規整的堆(如CMS收集器)。
      維護可用內存塊列表,分配時搜索足夠大的空間。
  • 線程安全
    • TLAB(Thread Local Allocation Buffer):為每個線程預分配堆內存區域,避免CAS競爭。
    • CAS重試:當TLAB不足時,使用CAS同步分配。

3. 初始化零值
  • 操作內容:將對象的內存空間初始化為零值。
    • 基本類型字段:int0booleanfalse
    • 引用類型字段:null
  • 目的:確保對象字段在不顯式初始化時也能直接使用。

4. 設置對象頭(Object Header)
  • 對象頭結構(64位JVM):
    • Mark Word:存儲哈希碼、GC分代年齡、鎖狀態(偏向鎖/輕量級鎖/重量級鎖)等信息。
    • Klass Pointer:指向類元數據,確定對象類型。
  • 示例
    |---------------------------|
    |        Mark Word (64位)    |
    |---------------------------|
    |   Klass Pointer (32位)     |
    |---------------------------|
    

5. 執行 <init> 方法
  • 步驟
    1. 初始化父類:遞歸調用父類構造方法(super())。
    2. 實例變量賦值:按代碼順序執行顯式初始化和構造代碼塊。
    3. 構造器代碼:執行用戶編寫的構造方法邏輯。
  • 目的:完成對象按業務需求的初始化。

內存分配優化策略

策略說明適用場景
TLAB分配線程私有內存區域,減少CAS競爭高頻創建小對象的場景
逃逸分析若對象未逃逸方法,可能在棧上分配或標量替換方法內部臨時對象(JIT優化)
大對象直接進入老年代避免在新生代頻繁復制(通過 -XX:PretenureSizeThreshold 設置閾值)大數組、大字符串等

對象內存布局

區域內容大小(64位JVM)
對象頭(Header)Mark Word(鎖狀態、哈希碼等) + Klass Pointer(類元數據指針)12字節(開啟壓縮指針)
實例數據(Instance Data)對象實際字段值(包括父類繼承字段)由字段類型和數量決定
對齊填充(Padding)補齊對象大小為8字節的整數倍0~7字節

常見問題與解決方案

  1. 內存分配失敗

    • 觸發GC:當Eden區空間不足時,觸發Minor GC。
    • OOM處理:若GC后仍無法分配,拋出 OutOfMemoryError
  2. 線程競爭

    • TLAB優化:通過 -XX:+UseTLAB 啟用(默認開啟),減少CAS沖突。
  3. 對象初始化順序

    • 字段默認值 → 顯式賦值 → 構造器代碼:確保初始化符合Java規范。

總結

Hotspot虛擬機通過 類加載檢查 → 內存分配 → 初始化 → 對象頭設置 → 構造方法調用 的流程創建對象,結合 TLAB、逃逸分析 等優化策略,平衡性能與安全性。理解這一過程有助于優化代碼(如減少大對象創建)和排查內存問題(如OOM)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901142.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901142.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901142.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

南墻WAF非標端口防護實戰解析——指定端口安全策略深度剖析

本文系統解析非標端口DDoS攻擊防護難點&#xff0c;重點闡述南墻WAF在指定端口防御中的技術突破。通過某金融機構真實攻防案例&#xff0c;結合Gartner最新防御架構模型&#xff0c;揭示如何構建基于智能流量建模的精準防護體系&#xff0c;為金融、政務等關鍵領域提供可落地的…

Context的全面解析:在不同技術應用中的通用作用與差異

Context的全面解析&#xff1a;在不同技術應用中的通用作用與差異 引言&#xff1a; 在軟件開發中&#xff0c;“Context”這個概念被廣泛使用。它不僅限于某個特定的技術或編程語言&#xff0c;實際上&#xff0c;Context 作為一種抽象的設計模式&#xff0c;貫穿在許多開發領…

尋找峰值 --- 二分查找

目錄 一&#xff1a;題目 二&#xff1a;算法原理 三&#xff1a;代碼實現 一&#xff1a;題目 題目鏈接&#xff1a;162. 尋找峰值 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代碼實現 class Solution { public:int findPeakElemen…

基礎算法訓練7

目錄 庫存管理II 翻轉對 合并K個升序鏈表 存在重復元素II 字符串相乘 字符串解碼 在每個樹行中找最大值 數據流的中位數 被包圍的區域 為高爾夫比賽砍樹 庫存管理II LCR 159. 庫存管理 III - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;先進行排序&a…

從單機版到超級APP:MCP如何解鎖AI的超能力

MCP&#xff1a;AI界的“萬能充電寶”——讓AI從此告別“語言不通”的尷尬&#xff01; 開篇&#xff1a;AI咖啡館的尷尬日常 想象一下這樣的場景&#xff1a; 一位AI助手在咖啡館里手忙腳亂——它想幫用戶點杯咖啡&#xff0c;但需要先寫代碼調用天氣API&#xff08;“今天下…

Grafana將棄用AngularJS-我們該如何遷移

AngularJS 棄用時間線 AngularJS 支持已在 Grafana 9 中正式棄用。在 2024 年 5 月發布的 Grafana 11 中&#xff0c;所有 Grafana Cloud 和自托管安裝默認關閉該功能。到 Grafana 12 版本時&#xff0c;將完全移除對 AngularJS 的支持&#xff0c;包括配置參數開關 angular_s…

Qt之opengl定點數據添加更多屬性

將顏色數據加入到定點數據中去 shader中代碼 api中的代碼 #include "sunopengl.h"#include <QTime>sunOpengl::sunOpengl(QWidget *parent) { } unsigned int VBO,VAO; float vertices[]{0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, 0.0f, 0.0f, 1.0f…

【Flink運行時架構】作業提交流程

本文介紹在單作業模式下Flink提交作業的具體流程&#xff0c;如下圖所示。 客戶端將作業提交給YARN的RM&#xff1b;YARN的RM啟動Flink JobManager&#xff0c;并將作業提交給JobMaster&#xff1b;JobMaster向Flink內置的RM請求slots&#xff1b;Flink內置的RM向YARN RM請求…

AI大模型技術之RAG、模型微調、知識蒸餾

AI大模型技術之RAG、模型微調、知識蒸餾 檢索增強生成&#xff08;RAG&#xff09;技術原理垂直領域應用場景使用的局限性 模型微調&#xff08;Fine-tuning&#xff09;技術原理垂直領域應用場景使用的局限性 知識蒸餾&#xff08;Distillation&#xff09;技術原理垂直領域應…

深入淺出:信號燈與系統V信號燈的實現與應用

深入淺出&#xff1a;信號燈與系統V信號燈的實現與應用 信號燈&#xff08;Semaphore&#xff09;是一種同步機制&#xff0c;用于控制對共享資源的訪問。在多線程或多進程環境下&#xff0c;信號燈能夠幫助協調多個執行單元對共享資源的訪問&#xff0c;確保數據一致性與程序…

消防設施操作員崗位注意事項有哪些?

消防設施操作員主要負責消防設施的操作、維護和管理等工作&#xff0c;其崗位注意事項涉及操作規范、設備維護、應急處理等多個關鍵領域&#xff0c;以下是具體內容&#xff1a; 操作規范方面 熟悉設備原理&#xff1a;要全面了解各類消防設施的工作原理、性能參數和操作方法…

SQL:Relationship(關系)

目錄 &#x1f517; 什么是 Relationship&#xff1f; 三種基本關系類型&#xff08;基于實體間的關系&#xff09;&#xff1a; 1. 一對一&#xff08;One-to-One&#xff09; 2. 一對多&#xff08;One-to-Many&#xff09; 3. 多對多&#xff08;Many-to-Many&#xf…

php偽協議

PHP 偽協議&#xff08;PHP Stream Wrapper&#xff09; PHP 的偽協議&#xff08;Protocol Wrapper&#xff09;是一種機制&#xff0c;允許開發者通過統一的文件訪問函數&#xff08;如 file_get_contents、fopen、include 等&#xff09;訪問不同類型的數據源&#xff0c;包…

當DRAM邂逅SSD:新型“DRAM+”存儲技術來了!

在當今快速發展的科技領域&#xff0c;數據存儲的需求日益增長&#xff0c;對存儲設備的性能和可靠性提出了更高的要求。傳統DRAM以其高速度著稱&#xff0c;但其易失性限制了應用范圍&#xff1b;而固態硬盤SSD雖然提供非易失性存儲&#xff0c;但在速度上遠不及DRAM。 為了解…

org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow...

Spark異常&#xff1a;Kryo serialization failed: Buffer overflow. 1、問題描述 SparkSQL任務報錯如下&#xff1a; org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: xxx. To avoid this, increase spark.kryoseri…

編譯原理 實驗二 詞法分析程序自動生成工具實驗

文章目錄 實驗環境的準備實驗實驗預備知識分析案例所要做的任務實戰 實驗環境的準備 安裝flex 安裝MinGW MinGW Installation Manager頁面 apply changes 下載比較耗時 只看到了一個文件&#xff0c;復制過去 配置環境變量 使用gcc -v檢驗是否安裝完成 實驗 實驗預備知識…

BERT - 直接調用transformers.BertModel, BertTokenizerAPI不進行任何微調

本節代碼將使用 transformers 庫加載預訓練的BERT模型和分詞器&#xff08;Tokenizer&#xff09;&#xff0c;并處理文本輸入。 1. 加載預訓練模型和分詞器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…

Python 質數篩選:從入門到優化的 5 種方法

質數&#xff08;Prime Number&#xff09;是指只能被 1 和自身整除的自然數&#xff0c;如 2、3、5、7 等。在算法題、密碼學或數學計算中&#xff0c;高效生成質數至關重要。 Python 提供了多種方法來實現質數篩選&#xff0c;但不同方法的效率差異巨大。本文從 最基礎的方法…

C#MQTT協議服務器與客戶端通訊實現(客戶端包含斷開重連模塊)

C#MQTT協議服務器與客戶端通訊實現 1 DLL版本2 服務器3 客戶端 1 DLL版本 MQTTnet.DLL版本-2.7.5.0 基于比較老的項目中應用的DLL&#xff0c;其他更高版本變化可能較大&#xff0c;謹慎參考。 2 服務器 開啟服務器 關閉服務器 綁定事件【客戶端連接服務器事件】 綁定事件【客戶…

【連載3】基礎智能體的進展與挑戰綜述

基礎智能體的進展與挑戰綜述 從類腦智能到具備可進化性、協作性和安全性的系統 【翻譯團隊】劉軍(liujunbupt.edu.cn) 錢雨欣玥 馮梓哲 李正博 李冠諭 朱宇晗 張霄天 孫大壯 黃若溪 2. 認知 人類認知是一種復雜的信息處理系統&#xff0c;它通過多個專門的神經回路協調運行…