1. 程式人生 > >Java 內存管理

Java 內存管理

垃圾回收器 內存管理 建議 strong 加載 結束 對象 9.png 區分

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 內存管理