通常Java記憶體配置設定會涉及到以下幾個區域:
寄存器:在CPU内部,通常開發人員不能通過代碼來控制的部分,主要是有編譯器自己來管理的
棧:存放基本類型的資料和對象的引用,對象本身不存放在棧中,而是存放在堆中
堆:存放對象,也就是通常在Java中new産生的資料
靜态區域:存放程式中定義的static的靜态成員
常量池:存放常量,如final定義的
非RAM存儲:硬碟等永久存儲空間,如持久化對象等等
對于了解Java中的記憶體配置設定主要是棧(stack)和堆(heap)記憶體
1、棧——stack
a、在棧中存放的是基本資料類型定義的變量以及對象的引用變量,比如:定義變量int a=3,b=3;定義對象引用String str ;HelloWorld hello;等這樣的資料都是存放棧記憶體中
b、棧中存放的資料是可以共享的,如:int a = 1 ; int b = 1 ;這裡不會對資料1存儲兩次,第二次定義的變量b的值所指向的變量a定義時的值1,如果b=2,那它會先周遊棧中的所有資料是否有值1存在,如果沒有,那麼它将重新申請一塊棧記憶體資源來存放值2
c、棧的存取速度比堆要快,僅次于寄存器。
d、棧中的記憶體是随着作用區域來回收的,當這個變量或者對象引用在這個作用範圍的代碼塊執行結束之後就自動釋放了
缺點:存在棧中的資料大小與生存期必須是 确定的,缺乏靈活性。
2、堆——heap
a、堆記憶體是用來存放由new建立的對象和數組的
b、堆中的記憶體大小是動态配置設定的,是以它是運作時記憶體,由Java GC自動回收。
如:
A a = new A();
通常辨識棧記憶體和堆記憶體,對于如上的這個表達式,=左邊的就是存放在棧記憶體中,=右邊的就是存放堆記憶體中。A a就是存在在棧記憶體中的一個對象的引用,這個引用就是指向堆記憶體中的new A()。
缺點:棧記憶體是運作到作用範圍之外之後釋放掉記憶體,而堆中的數組和對象,及時運作到所在的代碼塊之外,數組和對象本身占據的記憶體是不會被釋放的,數組和對象在沒有引用變量指向它時,就變為垃圾,不能再被使用,但仍舊占據着記憶體空間不放,在随後一個不确定的時間被垃圾收集器回收走。是以這就是Java比較占記憶體的原因。
備注:實際上,棧中的引用變量指向堆中的new對象,就是java中的指針。
本文轉自一米一陽光部落格園部落格,原文連結: http://www.cnblogs.com/candle806/archive/2013/01/22/2871741.html ,如需轉載請自行聯系原作者