Content Introduce
Java程序都運行在JVM虛擬機內部
JVM內存 | 內存占用 | 釋放 | 優(yōu)點 | 缺點 | 共享 | 超出 |
---|---|---|---|---|---|---|
堆區(qū)(heap) | new創(chuàng)建的對象 | 虛擬機GC | 靈活 | 效率低 | 全局共享 | OOM |
棧區(qū)(stack) | 存儲局部變量,引用變量 | 自動釋放 | 效率高 | 內存有限(遞歸小心) | 單獨線程共享 | SOF |
靜態(tài)區(qū)(static) | 全局 static 數據,常量 | 整個運行期間 | 共享給所有 | 加大內存負擔 | 全局共享 |
由于mk的語法原因上面不能寫全馏慨,更加詳細的埂淮,見下圖
其中靜態(tài)區(qū)其實叫方法區(qū),又叫no-heap 非堆區(qū)写隶,它與Java堆一樣倔撞,是各個線程共享的內存區(qū)域,它用于存儲已被虛擬機加載的類信息慕趴、常量痪蝇、靜態(tài)變量、即時編譯器編譯后的代碼等冕房。
數據躏啰。
sample
public class Sample() {
int s1 = 0;
Sample mSample1 = new Sample();
public void method() {
int s2 = 1;
Sample mSample2 = new Sample();
}
}
Sample mSample3 = new Sample();
說明:
Sample 類的局部變量 s2 和引用變量 mSample2 都是存在于棧中,但 mSample2 指向的對象是存在于堆上的毒费。
mSample3 指向的對象實體存放在堆上丙唧,包括這個對象的所有成員變量 s1 和 mSample1愈魏,而它自己存在于棧中觅玻。
Detailed description
棧內存, 在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時培漏,java就在棧中為這個變量分配內存空間溪厘,當超過變量的作用域后,java會自動釋放掉為該變量分配的內存空間牌柄,該內存空間可以立刻被另作他用畸悬。
堆內存用于存放由new創(chuàng)建的對象和數組。在堆中分配的內存珊佣,由java虛擬機自動垃圾回收器來管理蹋宦。在堆中產生了一個數組或者對象后,還可以在棧中定義一個特殊的變量咒锻,這個變量的取值等于數組或者對象在堆內存中的首地址冷冗,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以后就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象惑艇,引用變量相當于為數組或者對象起的一個別名蒿辙,或者代號拇泛。
引用變量是普通變量,定義時在棧中分配內存思灌,引用變量在程序運行到作用域外釋放俺叭。而數組&對象本身在堆中分配,即使程序運行到使用new產生數組和對象的語句所在地代碼塊之外泰偿,數組和對象本身占用的堆內存也不會被釋放熄守,數組和對象在沒有引用變量指向它的時候,才變成垃圾甜奄,不能再被使用柠横,但是仍然占著內存,在隨后的一個不確定的時間被垃圾回收器釋放掉课兄。這個也是java比較占內存的主要原因牍氛,********實際上,棧中的變量指向堆內存中的變量烟阐,這就是 Java 中的指針!
參考:
http://blog.csdn.net/codeemperor/article/details/51514448
http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html