Java 堆記憶體與棧記憶體異同(Java Heap Memory vs Stack Memory Difference)

來源:互聯網
上載者:User

標籤:

--reference Java Heap Memory vs Stack Memory Difference

在資料結構中,堆和棧可以說是兩種最基礎的資料結構,而Java中的棧記憶體空間和堆記憶體空間有什麼異同,以及和資料結構中的堆棧有何關係?

一、Java 堆儲存空間

堆記憶體(堆儲存空間)會在Java運行時分配給對象(Object)或者JRE的類。只要我們建立了一個對象,那麼在堆中肯定會分配一Block Storage空間給這個對象。而我們熟知的Java記憶體回收就是在堆儲存空間上進行的,用以釋放那些沒有任何引用指向自身的對象。任何在堆中分配的對象都有全域存取權限,而且可以從應用的任何地方被引用。

二、Java 棧儲存空間

Java 棧儲存空間用來供線程執行時使用。棧空間中包含特別的變數如:短生命週期和指向其他在堆中對象的引用。這裡棧儲存空間滿足後進先出的順序。當一個函數被調用時,會在棧中分配一塊新的儲存空間,用來存放函數的基本資料(【Java心得總結一】Java基本類型和封裝類型解析)以及在函數中對其它對象的引用。一旦函數執行結束,儲存空間就會被釋放供下一個函數使用。

棧儲存空間遠遠小於堆儲存空間

三、舉例

Memory.java

 1 public class Memory { 2   3     public static void main(String[] args) { // Line 1 4         int i=1; // Line 2 5         Object obj = new Object(); // Line 3 6         Memory mem = new Memory(); // Line 4 7         mem.foo(obj); // Line 5 8     } // Line 9 9  10     private void foo(Object param) { // Line 611         String str = param.toString(); //// Line 712         System.out.println(str);13     } // Line 814  15 }

展示了堆棧儲存空間是如何儲存基本類型、對象以及指向變數的引用

 程式執行過程:

  1. 一旦我們開始運行程式,它會將所有運行時類裝載入堆儲存空間。當程式運行至第一行main()函數,Java Runtime會為主函數線程分配棧儲存空間。
  2. 我們在第二行建立了基礎資料型別 (Elementary Data Type),所以它會被儲存在主函數線程的棧儲存空間;
  3. 因為我們在第三行建立了Object對象,它會在堆中被建立,並且棧空間中儲存有指向它的引用。同理第四行建立Memory對象。
  4. 當我們在main()主函數第五行調用foo()函數時,在棧空間頂部會分配一塊空間給foo()函數使用。因為Java是值傳遞(Java 為值傳遞而不是引用傳遞),在foo函數第六行中會有一個新的引用被建立指向堆中的Object對象
  5. 在第7行建立了一個字串,它會被放在堆空間的字串池中(String Poll),而且在棧空間中會儲存一個指向它的引用
  6. 在第8行foo函數執行完畢,此時其棧空間會被釋放
  7. 在第9行main函數執行完畢,棧中分配給main函數的空間會被釋放。同時程式也在這一行執行完畢,因此Java運行時(Java Runtime)會釋放所有記憶體空間並且終止程式的執行。
四、堆棧異同
  1. 堆儲存空間可以被應用的任何部分使用,然而棧儲存空間只能被對應的執行線程使用
  2. 一旦對象被建立,那麼就會在堆中分配一段儲存空間而棧空間中保留有對它的引用。棧空間中僅僅儲存基礎資料型別 (Elementary Data Type)和指向堆中對象的引用變數
  3. 堆中儲存的對象可以被全域訪問,然而棧中儲存的變數不能被其它線程(函數)訪問
  4. 棧中的記憶體管理採用先進後出的(LIFO)的方式,然而在堆中記憶體管理會更為複雜,因為堆中的對象可以被全域使用。對儲存空間被分為Young-Generation,Old-Generation等,這個我會在之後總結
  5. 棧儲存空間是短生命週期的,然而堆儲存要長的多
  6. 利用-Xms和-Xmx來指明JVM的堆初始空間和最大空間,利用-Xss來定義棧空間大小
  7. 當棧空間滿了,Java運行時會拋出 java.lang.StackOverFlowError ,然而堆空間滿了,拋出的是 java.lang.OutOfMemoryError: Java Heap Space 錯誤
  8. 棧空間相比較於堆空間是非常小的,又因為棧中使用最簡單的先進後出(LIFO)原則,它是遠遠快於堆的。

 

Java 堆記憶體與棧記憶體異同(Java Heap Memory vs Stack Memory Difference)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.