從事Java開發的都知道java有個垃圾回收機制Garbage collection,要準確理解Java的垃圾回收機制,咱們能夠從:「何時」,「對什麼東西」,「作了什麼事情」這三個方面來分析。0一、「何時」java
「何時」便是GC觸發的條件。GC觸發的條件有兩種:面試
程序調用System.gc時能夠觸發;算法
系統自身來決定GC觸發的時機。設計模式
系統判斷GC觸發的依據:根據Eden區和From Space區的內存大小來決定。當內存大小不足時,則會啓動GC線程並中止應用線程。api
新生代、老年代結構minor gc/full gc,還須要瞭解Minor GC 金額Full GC 觸發條件安全
Minor GC觸發條件:數據結構
當Eden區滿時,觸發Minor GC。架構
Full GC觸發條件:工具
調用System.gc時,系統建議執行Full GC,可是沒必要然執行學習
老年代空間不足
方法去空間不足
經過Minor GC後進入老年代的平均大小大於老年代的可用內存
由Eden區、From Space區向To Space區複製時,對象大小大於To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小於該對象大小
0二、「對什麼東西」
要是在面試時,面試官問「對什麼東西」,有的求職者回答 沒有用的對象,按道理來講,這並無錯,只是這並非理想的答案。要是能更進一步分析,那就更好了,GC操做的對象分爲:經過可達性分析法沒法搜索到的對象和能夠搜索到的對象。對於搜索不到的方法進行標記。從root搜索不到,並且通過第一次標記、清理後,仍然沒有復活的對象。
對於用可達性分析法搜索不到的對象,GC並不必定會回收該對象。要徹底回收一個對象,至少須要通過兩次標記的過程。
把問題具體化了一些,對相似這樣的對象進行回收,相信能給你此次面試加分。
0三、「作了什麼事情」
這個問題,回答空間其實挺大的,籠統地回答刪掉暫沒有使用的對象,節省內存。也不能說有錯誤,但要是咱們能把問題再具體化一些,效果會更好。
要想搞清楚因此然,這就要求咱們平時在開發中,要多留意去看看源代碼。閱讀源碼的好處:一方面能夠咱們從中學習代碼的架構,編碼風格等,另外一方面有助於咱們瞭解正在作的東西的實現原理,用到哪些算法、數據結構等。有助於咱們知其然又知因此然。
那麼咱們如何閱讀源碼呢?正確的學習方法不只可以讓咱們事半功倍,也可以讓咱們更容易理解前因後果。
做爲一名初學者,剛接觸源碼,每每讓初學者手足無措。咱們能夠先把源碼安裝起來編譯起來,結合它的操做文檔,熟悉其功能和它的api。
要是遇到的英文文檔,英文水平還能夠,能讓你閱讀英文的水平大幅提高。
瀏覽源碼的目錄結構,瞭解各個目錄的功能。從總體上理清這個工程由哪些模塊組成,最好能本身手動畫一份目錄結構圖。
通過前面兩步相信你對這個工程有了初步的瞭解。
熟悉源碼編碼風格,是採用駝峯命名規則仍是匈奴利亞法。平時在閱讀時,不妨參考下面3點作法。
閱讀源碼時要是看到工具類,要儘可能去熟悉。這一步的分析能夠學習到源代碼的系統架構方式。咱們能夠從中學到源碼的編寫技巧,有助於提升咱們的編碼能力。
結合一些安全規則,研究源碼在安全方面是如何設計的。這樣能夠提升本身在安全方面的意識。
研究系統所用到設計模式,同樣的功能實現,用到的設計模式可能相差不少,對比咱們以前所做的東東分析設計模式。對於設計模式,筆者從遇到一位從事4年多Android開發的同事,對設計模式並不重視,譬如建造者模式,AlertDialog.Builder這個,項目裏處處都用,可他就是不知道是怎麼實現,其實AlertDialog.Builder就是使用了Builder模式來構建AlertDialog的。
紙上得來終覺淺,得知此事要躬行。咱們能夠寫一些簡單的demo,注意是要本身手動編寫,不要想固然,而且調試出來,這樣才能作到更加理解代碼。好了,今天的分享就先到這,感謝閱讀!