Java 內存管理
1.內存管理
1)對象內存管理
- 編譯好的Java程序需要運行在JVM中
- 程序,無論代碼還是數據都需要存儲在內存中,JVM為Java程序提供並管理所需要的內存空間
- JVM內存分為“棧”、“堆”和“方法區”三個區域,分別用於存儲不同數據
2)堆
JVM在其內存空間開啟一個成為“堆”的存儲空間,這部分空間用於存儲使用new關鍵字所創建的對象。
- 存儲所有new出來的對象(包括成員變量)
3)成員變量的生命周期
訪問對象需要依靠引用變量,當一個對象沒有任何引用時,被視為廢棄的對象,屬於被回收的範圍,該對象中的所有成員變量也隨之被回收。
- 成員變量的聲明周期為:從對象在堆中創建開始到對象從堆中被回收結束。
4)垃圾回收機制
- 垃圾回收器(Garbage Collection,GC)是JVM自帶的一個線程(自動運行著的程序),用於回收沒有任何引用指向的對象
- 不用擔心內存管理,垃圾回收器(GC)不定時去堆中回收垃圾
- GC的回收對程序員來說是透明的,並不一定一發現有無引用的對象就立即回收
- 一般情況下,當我們需要GC線程即刻回收無用對象時,可以調用System.gc()方法
- System.gc()用於建議虛擬機馬上調度GC線程回收資源,具體的實現策略取決於不同的JVM系統
5)內存泄漏
內存泄漏是指,不再使用的內存沒有被及時的回收。嚴重的內存泄漏會因過多的內存占用而導致程序的崩潰。GC線程判斷對象是否可以回收的依據是該對象是否有引用指向,因此,當確定該對象不再使用時,應該及時將其引用設置為null。
6)棧
JVM在其內存空間開辟的一個稱為“棧”的存儲空間,棧用於存儲程序運行時在方法中聲明的所有局部變量(包括參數)。
7)局部變量聲明周期
一個運行的Java程序從開始到結束會有多次方法的調用,JVM會為每一個方法的調用在棧中分配一個對應的空間,這個空間成為該方法的棧幀。一個棧幀對應一個正在調用中的方法,棧幀中存儲了該方法的參數、局部變量等數據。當某一個方法調用完成後,其對應的棧幀將被清除,局部變量失效。
8)成員變量與局部變量比較
- 成員變量:
——定義再類中,方法外
——有默認初始值,可以不顯式初始化
——所在類被實例化後,存在堆中,對象被回收時,成員變量失效
- 局部變量:
——定義在方法中
——沒有默認值,必須自行設定初始值
——方法被調用時,存在棧中,方法調用結束,則棧幀被清除,局部變量一並失效
9)方法區
方法區用於存放類的信息,Java程序運行時,首先會通過類裝載器載入文件的字節碼信息,經過解析後將其裝入方法區。類的各種信息(包括方法)都在方法區存儲。
當類的信息被加載到方法區時,除了類的類型信息以外,同時類內的方法定義也被加載到方法區。
類再實例化對象時,多個對象會擁有各自在堆中的空間,但所有實例對象是共用在方法區中的一份方法定義的。
- 存儲.class字節碼文件(包括方法)
- 方法只有一份,通過this來區分具體的調用對象
Java 內存管理