java垃圾回收


與C/C++相比,java語言不需要程序員直接控制內存回收,java程序的內存分配和回收都是由JRE在后台自動進行,JRE會負責回收那些不再使用的內存,這種機制被稱為垃圾回收機制(Garbage Collection,GC):

一、主要負責兩件事情:

1.發現無用的對象;

2.回收被無用對象占用的內存空間,使之再次被程序使用(一般是在CPU空閑或者內存不足時)

注:事實上,除了釋放沒用對象占用的內存空間外,垃圾回收也可以清除內存紀錄碎片(由於創建對象和垃圾回收器釋放丟棄對象所占的內存空間)

二、特點

1.垃圾回收機制的工作目標是回收無用對象的內存空間,這些內存空間都是jvm堆內存(運行時數據區,用以保存類的實例,即對象)里的內存空間,不包含其它物力資源,比如數據庫連接、磁盤I/O等;

2.Java語言沒有顯式的提供分配內存和刪除內存的方法,一些開發人員將引用對象設置為null或者調用System.gc()或者Runtime.getRuntime.gc()來釋放內存(后兩種方法僅是建議,慎重使用)

3.垃圾回收不可預知,不同的jvm采用不同的垃圾回收機制和算法,有可能定時發生,有可能CPU空閑時發生,也有可能內存耗盡時發生(下面說下最為熟知的分代垃圾回收)

三、分代垃圾回收(資料來自http://www.cnblogs.com/yaoyuan23/p/5587548.html

1.年輕代(Young Generation):

所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。年輕代分三個區。一個Eden區,兩個Survivor區(一般而言)。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被復制到Survivor區(兩個中的一個)(YGC,年輕代垃圾回收),當這個Survivor區滿時,此區的存活對象將被復制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區復制過來的並且此時還存活的對象,將被復制“年老區(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先后關系,所以同一個區中可能同時存在從Eden復制過來 對象,和從前一個Survivor復制過來的對象,而復制到年老區的只有從第一個Survivor去過來的對象。而且,Survivor區總有一個是空的。同時,根據程序需要,Survivor區是可以配置為多個的(多於兩個),這樣可以增加對象在年輕代中的存在時間,減少被放到年老代的可能。

2.年老代(Old Generation):

在年輕代中經歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。

3.持久代(Permanent Generation):

用於存放靜態文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=<N>進行設置。

4.什么情況下觸發垃圾回收

由於對象進行了分代處理,因此垃圾回收區域、時間也不一樣。GC有兩種類型:Minor GC和Full GC。

Minor GC

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

Full GC

對整個堆進行整理,包括Young、Tenured和Perm。Full GC因為需要對整個對進行回收,所以比Full GC要慢,因此應該盡可能減少Full GC的次數。在對JVM調優的過程中,很大一部分工作就是對於Full GC的調節。有如下原因可能導致Full GC:

 年老代(Tenured)被寫滿

持久代(Perm)被寫滿

System.gc()被顯示調用

上一次GC之后Heap的各域分配策略動態變化

注:關於更多的jvm參數詳解可以參照:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM