1. 程式人生 > >#一分鐘讓你瞭解Java中的堆記憶體,棧記憶體

#一分鐘讓你瞭解Java中的堆記憶體,棧記憶體

JAVA面試、進階必備——堆記憶體與棧記憶體

java堆疊

java面試過程中經常會被問到關於堆疊的問題,這裡我稍微總結一下,供大家參考一下。

java的記憶體分為堆記憶體和棧記憶體

棧記憶體是指程式進入一個方法時,會為這個方法單獨分配一塊私屬儲存空間,用於儲存這個方法內部的區域性變數,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變數也將隨之釋放。

堆是與棧作用不同的記憶體,一般用於存放不放在當前方法棧中的那些資料,例如,使用new建立的物件都放在堆裡,所以,它不會隨方法的結束而消失。方法中的區域性變數使用final修飾後,放在堆中,而不是棧中。

從JVM認識堆疊

Stack是JVM的記憶體指令區。Stack管理很簡單,push一 定長度位元組的資料或者指令,Stack指標壓棧相應的位元組位移;pop一定位元組長度資料或者指令,Stack指標彈棧。並且每次操作的資料或者指令位元組長度是已知的。所以Java 基本資料型別,Java 指令程式碼,常量都儲存在Stack中。

Heap(堆)是JVM的記憶體資料區。Heap 的管理很複雜,每次分配不定長的記憶體空間,專門用來儲存物件的例項。

如果有想學習java的程式設計師,可來我們的java學習扣qun:94311,1692免費送java的視訊教程噢!我整理了一份適合18年學習的java乾貨,送給每一位想學的小夥伴,並且每天晚上8點還會在群內直播講解Java知識,歡迎大家前來學習哦

JAVA面試、進階必備——堆記憶體與棧記憶體

JVM空間分配

heap是堆:1、手動申請和釋放空間2、大自由區

stack是棧:1、自動分配和釋放2、空間有限

例:在Java中,若只是宣告一個物件,則先在棧記憶體中為其分配地址空間,若再new一下,例項化它,則在堆記憶體中為其分配地址。

Object a=null;只在棧中分配記憶體。

new Object();在堆中分配空間。

Object b =new Object();在棧中分配空間,指向堆中的地址。

記憶體中堆疊的關係

Heap是 Stack的一個子集。

Stack存取速度僅次於暫存器,儲存效率比heap高,可共享儲存資料,但是其中資料的大小和生存期必須在執行前確定。

Heap是執行時可動態分配的資料區,從速度看比Stack慢,Heap裡面的資料不共享,大小和生存期都可以在執行時再確定。

new關鍵字 是執行時在Heap裡面建立物件,每new一次都一定會建立新物件,因為堆資料不共享。

回收上區別

Stack的記憶體管理是順序分配的,而且定長,不存在記憶體回收問題

Heap 則是隨機分配記憶體,不定長度,存在記憶體分配和回收的問題

在JVM中另有一個GC程序,定期掃描Heap ,它根據Stack中儲存的4位元組物件地址掃描Heap ,定位Heap 中這些物件,進行一些優化(例如合併空閒記憶體塊什麼的),並且假設Heap 中沒有掃描到的區域都是空閒的,統統refresh(實際上是把Stack中丟失了物件地址的無用物件清除了),這就是垃圾收集的