標籤:類型 image 技術分享 垃圾 執行個體 方法 com 需要 部分
1.記憶體管理
1)對象記憶體管理
- 編譯好的Java程式需要運行在JVM中
- 程式,無論代碼還是資料都需要儲存在記憶體中,JVM為Java程式提供並管理所需要的記憶體空間
- JVM記憶體分為“棧”、“堆”和“方法區”三個地區,分別用於儲存不同資料
2)堆
JVM在其記憶體空間開啟一個成為“堆”的儲存空間,這部分空間用於儲存使用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 記憶體管理