03 | JVM-GC概念

為何要垃圾回收

隨著程序的運行,內(nèi)存中存在的實例對象、變量等信息占據(jù)的內(nèi)存越來越多,如果不及時進(jìn)行垃圾回收,必然會帶來程序性能的下降,甚至?xí)驗榭捎脙?nèi)存不足造成一些不必要的系統(tǒng)異常。

那些要垃圾回收

根據(jù)之前的JVM內(nèi)存管理中知道,內(nèi)存主要是,堆,棧,方法區(qū),程序計數(shù)器,本地方法棧,而棧,方法區(qū),程序計數(shù)器的聲明周期是隨著線程的結(jié)束,內(nèi)存自動釋放的,所以垃圾回收主要是針對方法區(qū)

何時要垃圾回收

簡而言之就是對象在內(nèi)存中“沒用了”,這需要來及回收釋放內(nèi)存,但是如何判斷對象沒有用處則比較復(fù)雜,JVM定義了強(qiáng)、軟、若、虛四種引用類型來定義對象,不同的引用類型的對象,在GC的時候有不同的處理方式

  • 強(qiáng)引用(Strong Reference).就是為剛被new出來的對象所加的引用,它的特點就是,永遠(yuǎn)不會被回收。

  • 軟引用(Soft Reference).JVM內(nèi)存并不緊張,這類對象可以不被回收,如緩存對象

  • 弱引用(Weak Reference).弱引用的對象就是一定需要進(jìn)行垃圾回收的,不管內(nèi)存是否緊張

  • 虛引用(Phantom Reference).JVM完全不會在乎虛引用,其唯一作用就是做一些跟蹤記錄,輔助finalize函數(shù)的使用

垃圾回收方式

內(nèi)存主要被分為三塊,新生代老年代、持久代。三代的特點不同,造就了他們所用的GC算法不同

  • 新生代:用于存儲新new出來的對象,一般垃圾回收回收這里,當(dāng)垃圾回收后沒有被回收的對象會放到Survivor Spaces中(為復(fù)制算法提供了專門的from-to區(qū)域)
  • 老年代:用于存儲,經(jīng)過幾次垃圾回收沒被回收的對象(如緩存對象)
  • 永久代:一般存儲方法區(qū)中的類信息,Class在被 Load的時候被放入PermGen space區(qū)域. 它和和存放Instance的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進(jìn)行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯誤

Scavenge GC

一般情況下,當(dāng)新對象生成,并且在Eden申請空間失敗時,就會觸發(fā)Scavenge GC,對Eden區(qū)域進(jìn)行GC,清除非存活對象,并且把尚且存活的對象移動到Survivor區(qū)。然后整理Survivor的兩個區(qū)。這種方式的GC是對年輕代的Eden區(qū)進(jìn)行,不會影響到年老代。因為大部分對象都是從Eden區(qū)開始的,同時Eden區(qū)不會分配的很大,所以Eden區(qū)的GC會頻繁進(jìn)行。因而,一般在這里需要使用速度快、效率高的算法,使Eden去能盡快空閑出來。

Full GC

對整個堆進(jìn)行整理,包括Young、Tenured和Perm。Full GC因為需要對整個對進(jìn)行回收,所以比Scavenge GC要慢,因此應(yīng)該盡可能減少Full GC的次數(shù)。在對JVM調(diào)優(yōu)的過程中,很大一部分工作就是對于FullGC的調(diào)節(jié)。有如下原因可能導(dǎo)致Full GC:
· 年老代(Tenured)被寫滿
· 持久代(Perm)被寫滿
· System.gc()被顯示調(diào)用
·上一次GC之后Heap的各域分配策略動態(tài)變化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile閱讀 5,503評論 1 56
  • 作者:一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-12】 更新日志 日期更新內(nèi)容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,322評論 0 7
  • JVM架構(gòu) 當(dāng)一個程序啟動之前,它的class會被類裝載器裝入方法區(qū)(Permanent區(qū)),執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,822評論 0 7
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時不同JDK版本的...
    高廣超閱讀 16,040評論 3 83
  • Java 虛擬機(jī)有自己完善的硬件架構(gòu), 如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,746評論 0 10

友情鏈接更多精彩內(nèi)容