文章插圖

文章插圖
1、Android內存管理機制1.1 Java內存分配模型
先上一張JVM將內存劃分區域的圖
棧內存:Java棧中存放的是一個個棧幀,每個棧幀對應一個被調用的方法 。棧幀包括局部標量表,
操作數棧 。
本地方法棧:本地方法棧主要是為執行本地方法服務的 。而Java棧是為執行Java方法服務的 。
方法區:該區域被線程共享 。主要存儲每個類的信息(類名,方法信息,字段信息等)、靜態變量,常量,以及編譯器編譯后的代碼等 。
堆:Java中的堆是被線程共享的,且JVM中只有一個堆內存,主要存儲對象本身及數組
1.2 Dalvik和ART介紹
Dalvik:Dalvik是Google公司自己設計用于Android平臺的Java虛擬機 。它可以支持已轉換為.dex格式的Java應用程序的運行,.dex格式是專門為Dalvik應用設計的一種壓縮格式,適合內存和處理器速度有限的系統,Dalvik經過優化,允許在有限的內存中同時運行多個虛擬機實例,并且每一個Dalvik應用做為獨立的Linux進程執行,獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉 。
ART:ART表示Android Runtime,Dalvik是依靠一個just-In -Time編譯器去解釋字節碼,運行時編譯后的應用都需要通過一個解釋器在用戶的設備上運行,這一機制并不是特別高效,但是能讓應用更容易在不同的硬件和架構上運行 。ART則是完全改變了這種做法,在安裝應用的時候就預編譯字節碼到機器語言,這一機制叫預編譯 。在移除解釋代碼這一過程,應用程序執行將更有效率,啟動速度更快 。
ART優點:
1.系統性能更高
2.應用啟動速度,運行更快,體驗更好,觸感反饋更加及時 。
3.更長的電池續航能力
4.支持更低的硬件
ART缺點:
1.儲存空間占用更大 。
2.應用安裝時間更長 。
Dalvik與ART區別
1.Dalvik每次都要編譯在運行,art只會安裝時啟動編譯
2.art占用的空間比Dalvik要大,就是用空間換時間
3.art減少編譯,減少CPU使用頻率,使用明顯改善電池續航
4.art啟動,運行更快,體驗更好,觸感反饋更及時 。
1.3 為什么要進行內存優化
1.減少oom,提高應用的穩定性
2.減少卡頓,體驗更好
3.減少內存占用,應用存活率更高
4.提前處理掉一些異常的隱患
2、Java內存回收算法2.1判斷Java中對象是否存活的算法2.1.1 引用計數算法
堆內存的每個對象都有一個引用計數器,當對象被引用的時候,計數器+1,當引用失效時計數器-1,當計數器的值為0時,說明該對象沒有被引用,就會被認為是垃圾對象,系統將會將其回收內存重新分配 。
優點:引用計數器執行簡單,判定效率高 。
缺點:對于循環引用的對象難以判斷出來,同時引用計數器增加了程序執行的開銷,在jdk1.1后,就不在使用了 。
2.1.1 根搜索法
GC Roots的對象做為起點,然后向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則該對象不可達,也就是說該對象為為垃圾對象,可以被回收 。
在Java中,可以做為GC Roots的對象包括一下四種:
1.虛擬機棧中引用的對象
2.方法區中的類靜態屬性引用的對象
3.方法區中常量引用的對象
4.本地方法棧中JNI的引用對象
2.2 JVM垃圾回收算法2.2.1 標記清除法
最基礎的垃圾收集算法,算法分為標記和清除兩個階段:首先標記出所有需要回收的對象,在標記完成之后統一回收掉所有被標記的對象 。
【android軟引用和弱引用 android強引用和弱引用】缺點:效率低,其次會產生大量的不連續的內存碎片,導致提前觸發另一次垃圾收集動作 。
復制回收算法是將可用內存按容量分成大小相等的兩塊,每次只使用其中的一塊,當這塊內存使用完了,就將存活的對象復制到另一塊內存上去,然后把使用過的內存空間一次清理掉,這樣使得每都次都是對其中一塊內存進行回收,內存分配時不用考慮內存碎片等復雜情況 。
缺點:可使用內存降為原來的一半 。
標記-整理算法在標記-清除算法的基礎上做了改進,標記階段將可回收的對象標記出來,標記完成后不是直接對可回收的對象進行清理,而是讓所有存活的對象都向一端移動,在移動的過程中清理掉可回收的對象 。
優點:相比于標記清除法來說,標記整理法不會大量產生不連續內存碎片問題 。
缺點:如果是在對象存活率較高的情況下會執行較多的復制操作,效率將會降低很多,而在存活率較低的情況下,效率會大大提高 。
當前商業虛擬機都是采用的是分代收集算法,根據對象存活的周期不同將內存劃分為幾塊,一般是將java堆分為年輕代,老年代和永久代 。然后根據各個年代的特點來采取不同收集算法,年輕代存活率較低,采用復制回收算法,老年代對象存活率較高,采用標記清除法或者是標記整理法來進行回收 。
內存波動圖呈鋸齒狀,gc頻繁導致卡頓 。
內存泄露簡單來說就是系統分配出去的內存由于某種原因導致沒法釋放,內存會越來越小,最終導致oom 。
3.3 內存溢出
即OOM,OOM時會導致程序異常 。Android設備出廠以后,java虛擬機對單個應用的最大內存分配就確定下來了,超出這個值就會OOM 。
4、內存優化常用工具4.1 Memory Profiler
Memory Profiler是Android studio自帶的工具,實時圖表形式展示應用內存使用的情況,可以用來識別內存泄露,抖動等
注意:如果在控制臺中沒有找到Profiler,可View —–> Tool Windows —> Profiler 進行打開
優點:方便直觀,便于線下使用
4.2 Memory Analyzer(MAT)
1、強大的java heap分析工具,查找內存泄露及內存占用
2、生成整體報告,便于分析問題
3、可以在線下深入使用
MAT使用:
MAT下載地址:
- 常用的虛擬機軟件有哪些? 什么虛擬機免費
- 虛擬打印機哪個好用 虛擬打印軟件有哪些
- 制作ppt的軟件哪個好 制作ppt哪種軟件好
- 免費打電話的軟件叫什么名字 免費打電話的軟件是什么
- 誤刪文件恢復軟件 文件刪除恢復工具
- 畫流程圖的軟件叫什么名 畫流程圖的軟件是什么
- 上網課自動點擊 網上聽課自動點擊軟件
- 軟件中的文檔是什么 軟件文檔的概念是什么
- 免費教學軟件在線下載 在線教育教學軟件
- 稅務ukey開票軟件怎么升級 增值稅發票稅控開票軟件怎么升級
