android性能優化和內存優化 android弱引用有哪些


android性能優化和內存優化 android弱引用有哪些


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 標記清除法最基礎的垃圾收集算法 , 算法分為標記和清除兩個階段:首先標記出所有需要回收的對象 , 在標記完成之后統一回收掉所有被標記的對象 。

推薦閱讀