首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JVM 調優總結(一):資料類型、堆棧模型與參數傳遞機制

     編輯:Java 相關知識

JVM 核心概念建立:資料類型分類、堆與棧的職責邊界、參數傳遞本質。

一、資料類型分類

分類包含類型特徵
基本類型 byte, short, int, long, char, float, double, boolean, returnAddress 變數儲存**原始值**本身
引用類型 類類型、介面類型、陣列 變數儲存**引用值** (指向堆中物件的地址),非物件本身

二、堆與棧:職責分離的藝術

堆與棧關係圖

核心定位

  • 棧 (Stack):**運行時單位** — 解決「程式如何執行、如何處理資料」
  • 堆 (Heap):**儲存單位** — 解決「資料怎麼放、放在哪兒」

對應關係

  • 每條線程對應**獨立線程棧** (執行邏輯各異)
  • 堆為**所有線程共享**

儲存內容

棧堆
區域變數 (基本型別 + 物件引用) 物件實體 (所有 new 出來的物件)
程式運行狀態、方法返回值、呼叫框架 僅負責物件資訊儲存

為什麼要分離?四大理由

  1. 軟體設計:棧代表處理邏輯,堆代表資料 — **分而治之、模組化**,邏輯更清晰
  2. 共享與交互:堆內容可被多棧共享 — **高效資料交互** (共享記憶體)、常量/快取共享節省空間
  3. 動態增長:棧只能向上增長、地址段固定 → 限制儲存能力;堆物件可**動態增長**,棧只需記錄堆地址 (4 bytes)
  4. 物件導向本質:物件屬性 → 資料 → **堆**;物件行為 (方法) → 邏輯 → **棧**。面向對象完美融合堆棧分離思想

三、關鍵執行細節

  • 程式入口:main 方法 = 棧的起始點 = 程式執行入口
  • 參數傳遞本質:只有傳值 (Pass-by-Value)
    1. Java 無指標概念,勿與 C 類比
    2. 程式運行永遠在棧中,參數傳遞只有基本型別與物件引用 (皆為定長數值)
    3. 傳遞物件引用時,實為「傳引用的值」,棧中處理方式與基本型別完全一致
    4. 進入被呼叫方法後,引用值被解析到堆中物件,**修改的是堆中物件內容而非引用本身**,故修改可保持
  • 物件樹狀觀:物件由基本型別組成。非葉子節點 = 物件引用,葉子節點 = 基本型別。參數傳遞值本身不可修改,但非葉子節點下的所有內容可修改
  • 棧大小調整:-Xss 設定。資料多時適當調大,否則拋 StackOverflowError (常見於無法返回的遞迴)

四、堆棧分離與 GC 的關係

程式可無堆 (純基本型別運算),但**不可無棧**。堆是為棧服務的共享記憶體。**正是堆棧分離思想,使 Java 垃圾回收成為可能** — GC 僅需掃描堆中物件引用拓撲,棧中引用作為 GC Roots 之一。

總結

基本類型存棧、物件存堆、引用存棧指向堆。參數傳遞統一為傳值 (引用值亦為值)。堆棧分離不僅是實作細節,更是支撐物件導向、共享記憶體、動態分配與自動 GC 的架構基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved