以前我寫了幾篇有關Java垃圾收集的文章以後,我收到了不少電子郵件,請求解釋Java堆空間,Java棧內存,Java中的內存分配以及它們之間的區別。
java
您可能在Java,Java EE書籍和教程中看到不少有關堆和變量內存的參考,可是幾乎沒有就程序而言徹底解釋堆和棧的內存分配的。程序員
Java運行時使用Java堆空間爲對象和JRE類分配內存。每當咱們建立任何對象時,它老是在堆空間中建立。面試
垃圾回收在堆內存上運行以釋放沒有任何引用的對象使用的內存。在堆空間中建立的任何對象都具備訪問權限,而且能夠從應用程序的任何位置進行引用。算法
Java Stack內存用於執行線程。它們包含短時間的方法特定值,以及從該方法引用的對堆中其餘對象的引用。spa
每當調用方法時,都會在磁盤存儲中建立一個新塊,以容納該方法的本地原始值並引用該方法中的其餘對象。線程
方法結束後,該塊將當即當即變爲未使用狀態,用做下一個方法使用。code
與堆內存分配,棧內存的大小要小一點。視頻
讓咱們用一個簡單的程序來了解堆和交替的內存使用狀況。對象
package com.journaldev.test; public class Memory { public static void main(String[] args) { // Line 1 int i=1; // Line 2 Object obj = new Object(); // Line 3 Memory mem = new Memory(); // Line 4 mem.foo(obj); // Line 5 } // Line 9 private void foo(Object param) { // Line 6 String str = param.toString(); //// Line 7 System.out.println(str); } // Line 8 }
下圖顯示了與上述程序有關的堆空間和棧內存,以及如何將其用做存儲原始,對象和引用變量。
blog
讓咱們看一下程序的執行步驟。
根據以上解釋,咱們能夠輕鬆得出如下堆空間和棧內存的區別。
java.lang.StackOverFlowError
引起,而若是堆內存已滿,則將引起java.lang.OutOfMemoryError: Java Heap Space
錯誤。就Java應用程序而言,這就是Java堆空間與棧內存的所有,我但願它能在執行任何Java程序時消除您對內存分配的疑問。
「不積跬步,無以致千里」,但願將來的你能:有夢爲馬 隨處可棲!加油,少年!
關注公衆號:「Java 知己」,天天更新Java知識哦,期待你的到來!