class会不会回收?用不到的class怎么回收_牛X的java程序员必备的GC基础知识, 面试肯定用的到...
1. GC回收哪些內存區(qū)域呢?
- 堆內存
- 對象
- 數組
- 方法區(qū)
- 該類所有的額實例都已經被回收, 也就是java堆中不存在該類的任何實例
- 加載該類的ClassLoader已經被回收
- 該類對應的java.lang.Class對象在任何地方沒有被引用, 也無法通過反射訪問該類方法。
- 垃圾回收性價比比較低, 一般不回收
- 廢棄常量
- 無用的類(需要同時滿足以下三個條件)
2. GC是如何判斷垃圾對象的?
1. 引用計數法
給對象的對象頭中添加一個counter引用計數器,當該對象被引用時,counter+1,當不被引用時, counter-1
當對象的counter為0時,則說明該對象不可用,也就是垃圾對象。
缺點:容易引起對象之間的互相循環(huán)引用,造成死鎖狀態(tài)。
2. 可發(fā)性分析算法
通過GC Roots的對象為起點,向下搜索,能到達的對象為不可回收對象,不能到達的對象為需要回收的對象。Java中就是通過可達性分析算法來判定對象是否存活的。
3. 對象引用
無論是通過引用計數算法判斷對象的引用數量,還是通過根搜索算法判斷對象的引用鏈是否可達,判定對象是否存活都與“引用”有關。
在JDK1.2之前,Java中的引用的定義很傳統(tǒng):**如果reference類型的數據中存儲的數值代表的是另外一塊內存的起始地址,就稱這塊內存代表著一個引用。**這種定義很純粹,但是太過狹隘,一個對象在這種定義下只有被引用或者沒有被引用兩種狀態(tài)。我們希望能描述這樣一類對象:當內存空間還足夠時,則能保留在內存之中;如果
在JDK1.2之后,Java對引用的概念進行了擴充,將引用分為強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference),這四種引用強度依次逐漸減弱。
- *強引用*就是指在程序代碼之中普遍存在,類似“Object obj = new Object()”這類的引用,*只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象。*
- ****軟引用****用來描述一些還有用,但并非必需的對象。**對于軟引用關聯著的對象,在系統(tǒng)將要發(fā)生內存溢出異常之前,將會把這些對象列進回收范圍之中并進行第二次回收。如果這次回收還是沒有足夠的內存,才會拋出內存溢出異常。**在JDK1.2之后提供了SoftReference類來實現軟引用。
- 弱引用也是用來描述非必需對象的,但是它的強度比軟引用更弱一些,****被弱引用關聯的對象只能生存到下一次垃圾收集發(fā)生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的的對象。****在JDK1.2之后提供了WeakReference類來實現弱引用。
- 虛引用(幽靈引用、幻影引用),他是最弱的一種引用關系。*一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。*為一個對象*設置虛引用關聯的唯一目的就是希望能**在這個對象被收集器回收時收到一個系統(tǒng)通知*。在JDK1.2之后,提供了PhantomReference類來實現虛引用。
4. 回收過程
第一次標記:使用可達性分析算法分析之后,判斷對象不可達。
第二次標記:finalize()方法(上訴或者對象自我救贖的唯一方式)。該方法會被垃圾回收器去調 用,并且只會被調用一次。所以可以在finalize方法中,重新建立可達性關聯,那么就完成了自我 救贖。否則被第二次標記。
3. 垃圾對象時怎么被回收的呢?
1. 復制回收算法
使用復制算法的垃圾回收步驟:
當Eden區(qū)發(fā)生垃圾回收之后,會將Eden區(qū)和Survivor其中的一塊區(qū)域中的對象,復制到另一塊 Survivor區(qū)域
然后將將Eden區(qū)和Survivor其中的一塊區(qū)域中的對象完全清理掉。
缺點:內存分配時會浪費新生代的10%的空間。
2. 標記清除算法
最基本的算法,主要分為標記和清除2個階段。首先標記出所有需要回收的對象,在標記完成后統(tǒng)一回收掉所有被標記的對象
缺點:
3. 標記整理算法
老年代沒有人擔保,不能用復制回收算法。可以用標記-整理算法,標記過程仍然與“標記-清除”算法一樣,然后讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存
4. 分代回收算法
當前商業(yè)虛擬機都是采用這種算法。根據對象的存活周期的不同將內存劃分為幾塊。
- 新生代,每次垃圾回收都有大量對象失去,選擇復制算法。
- 老年代,對象存活率高,無人進行分配擔保,就必須采用標記清除或者標記整理算法
5. 內存分配擔保
在JVM的內存分配時,也有這樣的內存分配擔保機制。就是當在新生代無法分配內存的時候,把新生代的對象轉移到老生代,然后把新對象放入騰空的新生代。
4. GC方式有哪些?
minorGC
新生代的垃圾回收,很快就回收了,新生代回收的頻率高
MajorGC
老年代的垃圾回收 比minorGC慢10倍
fullGC
整個JVM的垃圾回收。 整個堆(minorGC和majorGC)和方法區(qū)的垃圾回收。
system.gc()
老年代不夠用
方法區(qū)不夠用
當新生代的對象無法被老年代擔保成功時
總結
以上是生活随笔為你收集整理的class会不会回收?用不到的class怎么回收_牛X的java程序员必备的GC基础知识, 面试肯定用的到...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hikaricp mysql_使用 Hi
- 下一篇: 计算机管理中看不到本地用户,win7系统