Java中的堆和棧示例詳解
更新時間:2025年09月24日 14:37:40 作者:在努力的韓小豪
在Java中,堆(Heap)和棧(Stack)是兩種不同的內(nèi)存區(qū)域,本文給大家介紹Java中的堆和棧,結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
一、前言
- 在Java中,堆(Heap)和棧(Stack)是兩種不同的內(nèi)存區(qū)域;
- 用于管理程序運行時的數(shù)據(jù)存儲;
- 它們的核心區(qū)別在于存儲內(nèi)容、生命周期和內(nèi)存管理方式。
二、棧(Stack)
- 用途:
- 存儲方法調(diào)用的棧幀(每個方法對應(yīng)一個棧幀)。
- 存放局部變量(基本數(shù)據(jù)類型,如 int、boolean)和對象引用(即對象的地址)。
- 例如:int a = 10; 或 String s = “Hello”;(s 是引用,實際字符串在堆中)。
- 特點:
- 線程私有:每個線程有自己的棧,互不干擾。
- 快速分配:通過指針移動直接分配/釋放內(nèi)存。
- 自動管理:方法執(zhí)行完畢后,棧幀自動彈出,內(nèi)存立即回收。
- 容量較小:默認(rèn)大小通常為 1MB(可通過 -Xss 參數(shù)調(diào)整)。
- 溢出錯誤:遞歸過深或方法調(diào)用過多會導(dǎo)致 StackOverflowError。
三、堆(Heap)
- 用途:
- 存儲所有對象實例和數(shù)組(無論是 new 關(guān)鍵字創(chuàng)建的,還是靜態(tài)成員變量)。
- 例如:Object obj = new Object();(對象本身在堆中,obj 是棧中的引用)。
- 特點:
- 線程共享:所有線程共享堆內(nèi)存。
- 動態(tài)分配:內(nèi)存分配相對復(fù)雜,需考慮碎片化和垃圾回收。
- 生命周期不確定:對象存活到不再被引用時,由垃圾回收器(GC)自動回收。
- 容量較大:默認(rèn)大小為物理內(nèi)存的1/4(可通過 -Xms 和 -Xmx 調(diào)整初始值和最大值)。
- 溢出錯誤:內(nèi)存不足時拋出 OutOfMemoryError。
四、核心區(qū)別

五、代碼示例
public class Example {
public static void main(String[] args) {
int num = 42; // 基本類型變量 `num` 存儲在棧中
String str = "Hello"; // 引用 `str` 在棧中,字符串常量在堆的字符串池中
Object obj = new Object(); // 引用 `obj` 在棧中,對象實例在堆中
}
}
六、常見問題
為什么基本類型的成員變量在堆中?
- 如果基本類型是類的成員變量(如 class A { int x; }),則它們會隨對象實例存儲在堆中。
逃逸分析優(yōu)化:
- JVM會通過逃逸分析將某些對象直接分配到棧上(避免堆分配的開銷),開發(fā)者無需干預(yù)。
七、總結(jié)
- 棧:高效管理方法執(zhí)行和局部變量,自動回收,容量小。
- 堆:動態(tài)存儲對象,由GC管理,容量大,生命周期靈活。
- 理解兩者的區(qū)別對內(nèi)存優(yōu)化和問題排查(如內(nèi)存泄漏)至關(guān)重要。
到此這篇關(guān)于一文搞懂Java中的堆和棧的文章就介紹到這了,更多相關(guān)java 堆和棧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java的Hibernate框架中的List映射表與Bag映射
這篇文章主要介紹了Java的Hibernate框架中的List映射表與Bag映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
Spring Security實現(xiàn)基于角色的訪問控制框架
Spring Security是一個功能強大的安全框架,提供了基于角色的訪問控制、身份驗證、授權(quán)等安全功能,可輕松保護Web應(yīng)用程序的安全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04
Spring Boot詳細(xì)打印啟動時異常堆棧信息詳析
這篇文章主要給大家介紹了關(guān)于Spring Boot詳細(xì)打印啟動時異常堆棧信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
spring?boot之使用spring?data?jpa的自定義sql方式
這篇文章主要介紹了spring?boot之使用spring?data?jpa的自定義sql方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring 使用 feign時設(shè)置header信息的操作
這篇文章主要介紹了Spring 使用 feign時設(shè)置header信息的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

