接App優化以內存優化(序), 做爲App優化系列中內存優化的一個小部分.html
因爲內存相關知識比較生澀, 內存優化中使用到的相關工具, 也有不少專有名詞. 對Java內存管理, GC, Android內存管理, Dalvik/ART等知識有一個理論的認識, 可讓咱們更好的使用這些工具, 分析內存問題.java
據此, 咱們就先從理論入手, 聊聊GC那些事兒.程序員
GC 是 garbage collection 的縮寫, 垃圾回收的意思. 也能夠是 Garbage Collector, 也就是垃圾回收器.web
咱們先來解釋下Garbage Collector(垃圾回收器).shell
內存管理, 一直是編程中的一個大的問題. 在較老的語言中, 例如C++語言中, 內存管理是顯式的, 也就是說使用者本身申請內存使用, 本身釋放內存. 這就是爲何C++語言中除了構造函數, 還有析構函數. 咱們在建立對象的時候調用構造函數建立, 系統會在對象結束其做用域的時候調用析構函數, 咱們須要作的就是在析構函數中釋放掉咱們申請的相關資源, 以便釋放內存地址.編程
顯然, 這種顯式的由編程人員本身控制釋放內存的方式很容易出問題, 忘了, 漏了, 均可能致使內存問題. 也不符合程序員要懶的特徵. 服務器
故而, Java語言中引入了自動內存管理的機制, 也就是垃圾回收器. 大部分的現代面嚮對象語言, 也都是採用自動內存管理機制.併發
內存自動管理回收機制能夠解決大部分, 但不是全部的內存問題, 這也是爲何咱們要討論內存泄露.oracle
垃圾回收器有三大職責:jvm
垃圾回收器中有一個進程來作上面的這些事情, 這個進程查找咱們的對象引用的關係並釋放其內存, 這個進程就是garbage collection(垃圾回收), 也就是咱們常說的GC.
簡單說下:
直譯GC根, 咱們姑且不譯了吧.
所謂GC Root咱們能夠理解爲是一個Heap內存以外的對象, 一般包括但不只限於以下幾種:
若是這個對象是引用可達的, 則稱之爲活的(live), 反之, 若是這個對象引用不可達, 則稱之爲死的(dead), 也能夠稱之爲垃圾(garbage).
這個引用可達與不可達就是相對於GC Root來講的:
咱們日常在查看咱們的java版本時, 你會發現:
$ java -version
java 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有什麼關係呢?
在此簡單說下, 以便行文:
咱們當前使用的sun(oracle)的java版本(應該是1.3以上)都是內置的HotSpot VM實現. 因此接下來的分析也都是基於HotSpot VM的, 可是仍是簡稱JVM.
JVM使用分代式的內存管理方式, 將Heap分紅三代 --- 新生代, 老一代, 持久代.
Young Generation
Old Generation
Permanent Generation
小GC執行很是頻繁, 並且速度特別快.
大GC通常會比小GC慢十倍以上.
大小GC都會發出"Stop the World"事件, 也就是說中斷程序運行, 直至GC完成. 這也是咱們在App優化之消除卡頓中爲何說頻繁GC會形成用戶感知卡頓.
瞭解了內存Heap的幾個區域, 咱們再來看下垃圾收集器是怎麼利用這幾個區域來管理內存和回收垃圾的.
1. 建立新的對象
每當咱們使用new建立一個對象時, 這個對象會被分配到新生代的Eden區域:
2. 當Eden區域滿時
當Eden區域內存被分配完時, 小GC程序被觸發:
引用可達的對象會移到Survivor(倖存者)區域--S0, 而後清空Eden區域, 此時引用不可達的對象會直接刪除, 內存回收, 以下:
3. Eden再次滿時
當Eden區域再次分配完後, 小GC執行, 引用可達的對象會移到Survivor(倖存者)區域, 而引用不可達的對象會跟隨Eden的清空而刪除回收.
須要注意的是, 此次引用可達的對象移動到的是S1的倖存者區.
並且, S0區域也會執行小GC, 將其中還引用可達的對象移動到S1區, 且年齡+1. 而後清空S0, 回收其中引用不可達的對象.
此時, 全部引用可達的對象都在S1區, 且S1區的對象存在不一樣的年齡. 以下:
當Eden第三次滿時, S0和S1的角色互換了:
依此循環.
4. 當Survivor區的對象年齡達到"老年線"時
上面1~3循環, Survivor區的對象年齡也會持續增加, 當其中某些對象年齡達到"老年線", 例如8歲時, 它們會"晉升"到老年區.
如此1~4步重複, 大致流程是這樣的
轉載請註明出處, 歡迎你們分享到朋友圈, 微博~