Java把內存分紅兩種,一種叫作棧內存,一種叫作堆內存java
在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中爲這個變量分配內存空間,當超過變量的做用域後,java會自動釋放掉爲該變量分配的內存空間,該內存空間能夠馬上被另做他用。數組
堆內存用於存放由new建立的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在數據結構
數組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,可是仍然佔着內存,在隨後的一個不肯定的時間被垃圾回收器釋放掉。這個也是java比較佔內存的主要緣由。ide
按照編譯原理的觀點,程序運行時的內存分配有三種策略,分別是靜態的,棧式的,和堆式的. 函數
靜態存儲分配是指在編譯時就能肯定每一個數據目標在運行時刻的存儲空間需求,於是在編譯時就能夠給他們分配固定的內存空間.對象
棧式存儲分配也可稱爲動態存儲分配,棧式存儲分配要求在過程的入口處必須知道全部的存儲要求,而堆式存儲分配則專門負責在編譯時或運行時模塊入口處都沒法肯定存儲要求的數據結構的內存分配。內存
從堆和棧的功能和做用來通俗的比較,堆主要用來存放對象的,棧主要是用來執行程序的作用域