Android記憶體最佳化1 瞭解java GC 記憶體回收機制3

來源:互聯網
上載者:User

標籤:structure   自動   hotspot   loader   頻繁   roots   關係   dba   dalvik   

引言

接App最佳化之記憶體最佳化(序), 作為App最佳化系列中記憶體最佳化的一個小部分.

由於記憶體相關知識比較生澀, 記憶體最佳化中使用到的相關工具, 也有很多專有名詞. 對Java記憶體管理, GC, Android記憶體管理, Dalvik/ART等知識有一個理論的認識, 可以讓我們更好的使用這些工具, 分析記憶體問題.

據此, 我們就先從理論入手, 聊聊GC那些事兒.

1, 何為GC

GC 是 garbage collection 的縮寫, 記憶體回收的意思. 也可以是 Garbage Collector, 也就是記憶體回收行程.

1.1 記憶體回收行程

我們先來解釋下Garbage Collector(記憶體回收行程).

記憶體管理, 一直是編程中的一個大的問題. 在較老的語言中, 例如C++語言中, 記憶體管理是顯式的, 也就是說使用者自己申請記憶體使用量, 自己釋放記憶體. 這就是為什麼C++語言中除了建構函式, 還有解構函式. 我們在建立對象的時候調用建構函式建立, 系統會在對象結束其範圍的時候調用解構函式, 我們需要做的就是在解構函式中釋放掉我們申請的相關資源, 以便釋放記憶體位址.

顯然, 這種顯式的由編程人員自己控制釋放記憶體的方式很容易出問題, 忘了, 漏了, 都可能導致記憶體問題. 也不符合程式員要懶的特徵.

故而, Java語言中引入了自動記憶體管理的機制, 也就是記憶體回收行程. 大部分的現代物件導向語言, 也都是採用自動記憶體管理機制.

記憶體自動管理回收機制可以解決大部分, 但不是所有的記憶體問題, 這也是為什麼我們要討論記憶體泄露.

記憶體回收行程的職責

記憶體回收行程有三大職責:

  1. 分配記憶體;
  2. 確保任何被引用的對象保留在記憶體中;
  3. 回收不能通過參考關聯性找到的對象的記憶體.
記憶體回收的一般流程gc process1.2 相關概念記憶體回收(GC)

記憶體回收行程中有一個進程來做上面的這些事情, 這個進程尋找我們的對象引用的關係並釋放其記憶體, 這個進程就是garbage collection(記憶體回收), 也就是我們常說的GC.

Heap和Stack

簡單說下:

  • Heap記憶體是指java運行環境用來分配給對象和JRE類的記憶體. 是應用的記憶體空間.
  • Stack記憶體是相對於線程Thread而言的, 它儲存線程中方法中短期存在的變數值和對Heap中對象的引用等.
  • Stack記憶體, 顧名思義, 是類Stack方式, 總是後進先出(LIFO)的.
  • 我們通常說的GC的針對Heap記憶體的. 因為Stack記憶體相當於是隨用隨銷的.
heap&stackGC Root

直譯GC根, 我們姑且不譯了吧.
所謂GC Root我們可以理解為是一個Heap記憶體之外的對象, 通常包括但不僅限於如下幾種:

  • System Class 系統Class Loader載入的類. 例如java運行環境中rt.jar中類, 比如java.util.* package中的類.
  • Thread 運行中的線程
  • JNI 中的本地/全域變數, 使用者自訂的JNI代碼或是JVM內部的.
  • Busy Monitor 任何調用了wait()或notify()方法, 或是同步化的(synchronized)的東西. 可以理解為同步監控器.
  • Java本地執行個體, 還在啟動並執行Thread的stack中的方法建立的對象.
活對象/垃圾

如果這個對象是引用可達的, 則稱之為活的(live), 反之, 如果這個對象引用不可達, 則稱之為死的(dead), 也可以稱之為垃圾(garbage).

這個引用可達與不可達就是相對於GC Root來說的:

gc-roots2, Java的記憶體管理機制2.1 關於JVM

我們平常在查看我們的java版本時, 你會發現:

$ java -versionjava version "1.8.0_74"Java(TM) SE Runtime Environment (build 1.8.0_74-b02)Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

其中有個HotSpot VM的東西, 那麼這個是什麼呢? 和JVM有什麼關係呢?

在此簡單說下, 以便行文:

  • JVM, Java虛擬機器, 可以簡單理解為一種技術思想, 虛擬技術理念.
  • HotSpot VM是JVM的一種實現, 包含了伺服器版和傳統型應用程式版, 現時由Oracle維護並發布.

我們當前使用的sun(oracle)的java版本(應該是1.3以上)都是內建的HotSpot VM實現. 所以接下來的分析也都是基於HotSpot VM的, 但是還是簡稱JVM.

2.2 JVM記憶體地區

JVM使用分代式的記憶體管理方式, 將Heap分成三代 --- 新生代, 老一代, 持久代.

Hotspot heap structure
  • Young Generation

    • 新生代.
    • 所有new的對象.
    • 該地區的記憶體管理使用minor garbage collection(小GC).
    • 更進一步分成Eden space, Survivor 0 和 Survivor 1 三個部分.
  • Old Generation

    • 老年區.
    • 新生代中執行小粒度的GC倖存下來的"老"對象.
    • 該地區的記憶體管理使用major garbage collection(大GC).
  • Permanent Generation

    • 持久代.
    • 包含應用的類/方法資訊, 以及JRE庫的類和方法資訊.

小GC執行非常頻繁, 而且速度特別快.
大GC一般會比小GC慢十倍以上.
大小GC都會發出"Stop the World"事件, 也就是說中斷程式運行, 直至GC完成. 這也是我們在App最佳化之消除卡頓中為什麼說頻繁GC會造成使用者感知卡頓.

3, GC的流程

瞭解了記憶體Heap的幾個地區, 我們再來看下垃圾收集器是怎麼利用這幾個地區來管理記憶體和回收垃圾的.

1. 建立新的對象

每當我們使用new建立一個對象時, 這個對象會被分配到新生代Eden地區:

object allocation

2. 當Eden地區滿時
當Eden地區記憶體被分配完時, 小GC程式被觸發:

Eden filling

引用可達的對象會移到Survivor(倖存者)地區--S0, 然後清空Eden地區, 此時引用不可達的對象會直接刪除, 記憶體回收, 如下:

aged

3. Eden再次滿時
當Eden地區再次分配完後, 小GC執行, 引用可達的對象會移到Survivor(倖存者)地區, 而引用不可達的對象會跟隨Eden的清空而刪除回收.

需要注意的是, 這次引用可達的對象移動到的是S1的倖存者區.
而且, S0地區也會執行小GC, 將其中還引用可達的對象移動到S1區, 且年齡+1. 然後清空S0, 回收其中引用不可達的對象.

此時, 所有引用可達的對象都在S1區, 且S1區的對象存在不同的年齡. 如下:

next filling

當Eden第三次滿時, S0和S1的角色互換了:

s0s1

依此迴圈.

4. 當Survivor區的對象年齡達到"老年線"時
上面1~3迴圈, Survivor區的對象年齡也會持續增長, 當其中某些對象年齡達到"老年線", 例如8歲時, 它們會"晉陞"到老年區.

old aged

如此1~4步重複, 大體流程是這樣的

gc flow

anly_jun
連結:https://www.jianshu.com/p/5db05db4f5ab
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

Android記憶體最佳化1 瞭解java GC 記憶體回收機制3

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.