對象內存管理
-
編譯好的Java程序要運行在JVM中
-
程序,無論是代碼還是數據,都要存儲在內存中,JVM爲Java程序提供並管理所需要的內存空間
-
JVM在其內存開闢了"堆"、“棧”、"方法區"三個區域,分別存儲不同的數據;
垃圾回收機制
-
垃圾回收器(GC)是JVM自帶的一個線程(自動運行着的程序),用於回收沒有任何引用指向的對象;
-
Java程序員不用擔心內存管理,因爲GC會自動進行回收管理;
-
GC的回收對程序員來說是透明的,並不一定一發現有無引用的對象,就立刻回收;
-
System.gc():用於建議虛擬機馬上調度GC線程回收資源,具體的實現策略取決於不同的JVM系統;
堆內存
-
這部分空間用於存儲使用new關鍵字所創建的對象,成員變量是對象的屬性,也在堆中;
-
對象的聲明週期:創建對象時存在堆中,對象被GC回收時消失;
-
內存泄漏:不再使用的對象沒有被及時的回收;
-
建議:當對象不在使用時應及時將引用設置爲null;
非堆–棧
-
這部分空間用於存儲程序運行時(正在調用中的)在方法中聲明的所有局部變量;
-
調用方法時JVM在棧中爲該方法分配一個對應的空間,也稱爲棧幀,棧幀中包含所有的局部變量(包括參數);
-
當方法調用結束時,棧幀消失;
-
局部變量的生命週期:調用方法時存在棧中,方法調用結束時與棧幀一併消失;
非堆–方法區
-
這部分空間用於存放類的信息(包括方法);
-
Java程序運行時,首先會通過類裝載器載入類文件的字節碼信息,經過解析後將其裝入方法區;
-
所有對象共享類的方法,方法僅有一份,通過this來區分具體的對象;