一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Android內(nèi)存管理機(jī)制與分析工具

Dbwd_Imgtec ? 來源:未知 ? 作者:胡薇 ? 2018-05-11 14:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Android 系統(tǒng)中有個垃圾內(nèi)存回收機(jī)制,在虛擬機(jī)層自動分配和釋放內(nèi)存,因此不需要在代碼中分配和釋放某一塊內(nèi)存,從應(yīng)用層面上不容易出現(xiàn)內(nèi)存泄漏和內(nèi)存溢出等問題,但是需要內(nèi)存管理。Android 系統(tǒng)在內(nèi)存管理上有一個 Generational Heap Memory 模型,內(nèi)存回收的大部分壓力不需要應(yīng)用層關(guān)心, Generational Heap Memory 有自己一套管理機(jī)制,當(dāng)內(nèi)存達(dá)到一個閾值時,系統(tǒng)會根據(jù)不同的規(guī)則自動釋放系統(tǒng)認(rèn)為可以釋放的內(nèi)存,也正是因為 Android 程序把內(nèi)存控制的權(quán)力交給了 Generational Heap Memory,一旦出現(xiàn)內(nèi)存泄漏和溢出方面的問題,排查錯誤將會成為一項異常艱難的工作。除此之外,部分 Android 應(yīng)用開發(fā)人員在開發(fā)過程中并沒有特別關(guān)注內(nèi)存的合理使用,也沒有在內(nèi)存方面做太多的優(yōu)化,當(dāng)應(yīng)用程序同時運(yùn)行越來越多的任務(wù),加上越來越復(fù)雜的業(yè)務(wù)需求時,完全依賴 Android 的內(nèi)存管理機(jī)制就會導(dǎo)致一系列性能問題逐漸呈現(xiàn),對應(yīng)用的穩(wěn)定性和性能帶來不可忽視的影響,因此,解決內(nèi)存問題和合理優(yōu)化內(nèi)存是非常有必要的。

Android內(nèi)存管理機(jī)制

Android 應(yīng)用都是在 Android 的虛擬機(jī)上運(yùn)行,應(yīng)用 程序的內(nèi)存分配與垃圾回收都是由虛擬機(jī)完成的。在 Android 系統(tǒng),虛擬機(jī)有兩種運(yùn)行模式:Dalvik 和 ART。

1、Java對象生命周期

一般Java對象在虛擬機(jī)上有7個運(yùn)行階段:

創(chuàng)建階段->應(yīng)用階段->不可見階段->不可達(dá)階段->收集階段->終結(jié)階段->對象空間重新分配階段

2、內(nèi)存分配

在 Android 系統(tǒng)中,內(nèi)存分配實(shí)際上是對堆的分配和釋放。當(dāng)一個 Android 程序啟動,應(yīng)用進(jìn)程都是從一個叫做 Zygote 的進(jìn)程衍生出來,系統(tǒng)啟動 Zygote 進(jìn)程后,為了啟動一個新的應(yīng)用程序進(jìn)程,系統(tǒng)會衍生 Zygote 進(jìn)程生成一個新的進(jìn)程,然后在新的進(jìn)程中加載并運(yùn)行應(yīng)用程序的代碼。其中,大多數(shù)的 RAM pages 被用來分配給Framework 代碼,同時促使 RAM 資源能夠在應(yīng)用所有進(jìn)程之間共享。

但是為了整個系統(tǒng)的內(nèi)存控制需要,Android 系統(tǒng)會為每一個應(yīng)用程序都設(shè)置一個硬性的 Dalvik Heap Size 最大限制閾值,整個閾值在不同設(shè)備上會因為 RAM 大小不同而有所差異。如果應(yīng)用占用內(nèi)存空間已經(jīng)接近整個閾值時,再嘗試分配內(nèi)存的話,就很容易引起內(nèi)存溢出的錯誤。

3、內(nèi)存回收機(jī)制

我們需要知道的是,在 Java 中內(nèi)存被分為三個區(qū)域:Young Generation(年輕代)、Old Generation(年老代)、Permanent Generation(持久代)。最近分配的對象會存放在 Young Generation 區(qū)域。對象在某個時機(jī)觸發(fā) GC 回收垃圾,而沒有回收的就根據(jù)不同規(guī)則,有可能被移動到 Old Generation,最后累積一定時間在移動到 Permanent Generation 區(qū)域。系統(tǒng)會根據(jù)內(nèi)存中不同的內(nèi)存數(shù)據(jù)類型分別執(zhí)行不同的 GC 操作。GC 通過確定對象是否被活動對象引用來確定是否收集對象,進(jìn)而動態(tài)回收無任何引用的對象占據(jù)的內(nèi)存空間。但需要注意的是頻繁的 GC 會增加應(yīng)用的卡頓情況,影響應(yīng)用的流暢性,因此需要盡量減少系統(tǒng) GC 行為,以便提高應(yīng)用的流暢度,減小卡頓發(fā)生的概率。

內(nèi)存分析工具

做內(nèi)存優(yōu)化前,需要了解當(dāng)前應(yīng)用的內(nèi)存使用現(xiàn)狀,通過現(xiàn)狀去分析哪些數(shù)據(jù)類型有問題,各種類型的分布情況如何,以及在發(fā)現(xiàn)問題后如何發(fā)現(xiàn)是哪些具體對象導(dǎo)致的,這就需要相關(guān)工具來幫助我們。

1、Memory Monitor

Memory Monitor 是一款使用非常簡單的圖形化工具,可以很好地監(jiān)控系統(tǒng)或應(yīng)用的內(nèi)存使用情況,主要有以下功能:

顯示可用和已用內(nèi)存,并且以時間為維度實(shí)時反應(yīng)內(nèi)存分配和回收情況。

快速判斷應(yīng)用程序的運(yùn)行緩慢是否由于過度的內(nèi)存回收導(dǎo)致。

快速判斷應(yīng)用是否由于內(nèi)存不足導(dǎo)致程序崩潰。

2、Heap Viewer

Heap Viewer 的主要功能是查看不同數(shù)據(jù)類型在內(nèi)存中的使用情況,可以看到當(dāng)前進(jìn)程中的 Heap Size 的情況,分別有哪些類型的數(shù)據(jù),以及各種類型數(shù)據(jù)占比情況。通過分析這些數(shù)據(jù)來找到大的內(nèi)存對象,再進(jìn)一步分析這些大對象,進(jìn)而通過優(yōu)化減少內(nèi)存開銷,也可以通過數(shù)據(jù)的變化發(fā)現(xiàn)內(nèi)存泄漏。

3、Allocation Tracker

Memory Monitor 和 Heap Viewer 都可以很直觀且實(shí)時地監(jiān)控內(nèi)存使用情況,還能發(fā)現(xiàn)內(nèi)存問題,但發(fā)現(xiàn)內(nèi)存問題后不能再進(jìn)一步找到原因,或者發(fā)現(xiàn)一塊異常內(nèi)存,但不能區(qū)別是否正常,同時在發(fā)現(xiàn)問題后,也不能定位到具體的類和方法。這時就需要使用另一個內(nèi)存分析工具 Allocation Tracker,進(jìn)行更詳細(xì)的分析, Allocation Tracker 可以分配跟蹤記錄應(yīng)用程序的內(nèi)存分配,并列出了它們的調(diào)用堆棧,可以查看所有對象內(nèi)存分配的周期。

4、Memory Analyzer Tool(MAT)

MAT 是一個快速,功能豐富的 Java Heap 分析工具,通過分析 Java 進(jìn)程的內(nèi)存快照 HPROF 分析,從眾多的對象中分析,快速計算出在內(nèi)存中對象占用的大小,查看哪些對象不能被垃圾收集器回收,并可以通過視圖直觀地查看可能造成這種結(jié)果的對象。

常見內(nèi)存泄漏場景

如果在內(nèi)存泄漏發(fā)生后再去找原因并修復(fù)會增加開發(fā)的成本,最好在編寫代碼時就能夠很好地考慮內(nèi)存問題,寫出更高質(zhì)量的代碼,這里列出一些常見的內(nèi)存泄漏場景,在以后的開發(fā)過程中需要避免這類問題。

資源性對象未關(guān)閉。比如Cursor、File文件等,往往都用了一些緩沖,在不使用時,應(yīng)該及時關(guān)閉它們。

注冊對象未注銷。比如事件注冊后未注銷,會導(dǎo)致觀察者列表中維持著對象的引用。

類的靜態(tài)變量持有大數(shù)據(jù)對象。

非靜態(tài)內(nèi)部類的靜態(tài)實(shí)例。

Handler臨時性內(nèi)存泄漏。如果Handler是非靜態(tài)的,容易導(dǎo)致 Activity 或 Service 不會被回收。

容器中的對象沒清理造成的內(nèi)存泄漏。

WebView。WebView 存在著內(nèi)存泄漏的問題,在應(yīng)用中只要使用一次 WebView,內(nèi)存就不會被釋放掉。

除此之外,內(nèi)存泄漏可監(jiān)控,常見的就是用LeakCanary 第三方庫,這是一個檢測內(nèi)存泄漏的開源庫,使用非常簡單,可以在發(fā)生內(nèi)存泄漏時告警,并且生成 leak tarce 分析泄漏位置,同時可以提供 Dump 文件進(jìn)行分析。

優(yōu)化內(nèi)存空間

沒有內(nèi)存泄漏,并不意味著內(nèi)存就不需要優(yōu)化,在移動設(shè)備上,由于物理設(shè)備的存儲空間有限,Android 系統(tǒng)對每個應(yīng)用進(jìn)程也都分配了有限的堆內(nèi)存,因此使用最小內(nèi)存對象或者資源可以減小內(nèi)存開銷,同時讓GC 能更高效地回收不再需要使用的對象,讓應(yīng)用堆內(nèi)存保持充足的可用內(nèi)存,使應(yīng)用更穩(wěn)定高效地運(yùn)行。

常見做法如下:

對象引用。強(qiáng)引用、軟引用、弱引用、虛引用四種引用類型,根據(jù)業(yè)務(wù)需求合理使用不同,選擇不同的引用類型。

減少不必要的內(nèi)存開銷。注意自動裝箱,增加內(nèi)存復(fù)用,比如有效利用系統(tǒng)自帶的資源、視圖復(fù)用、對象池、Bitmap對象的復(fù)用。

使用最優(yōu)的數(shù)據(jù)類型。比如針對數(shù)據(jù)類容器結(jié)構(gòu),可以使用ArrayMap數(shù)據(jù)結(jié)構(gòu),避免使用枚舉類型,使用緩存Lrucache等等。

圖片內(nèi)存優(yōu)化。可以設(shè)置位圖規(guī)格,根據(jù)采樣因子做壓縮,用一些圖片緩存方式對圖片進(jìn)行管理等等。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3973

    瀏覽量

    130324
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3125

    瀏覽量

    75297

原文標(biāo)題:Android APP 性能優(yōu)化的一些思考(二)

文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    控制器中如何設(shè)計MMU--虛擬內(nèi)存管理機(jī)制

    控制器中如何設(shè)計MMU--虛擬內(nèi)存管理機(jī)制
    發(fā)表于 12-15 09:53

    安卓應(yīng)用商店和APP市場管理機(jī)制

    “工信部正在搭建移動應(yīng)用軟件認(rèn)證和管理服務(wù),以加強(qiáng)對智能終端的安全管理?!惫ば挪肯嚓P(guān)負(fù)責(zé)人昨日表示,目前為了解決智能終端的安全問題,內(nèi)部確實(shí)已經(jīng)明確了需要一套對安卓應(yīng)用商店和APP市場管理機(jī)制,包括上線前的審核和上線后的監(jiān)測和抽
    發(fā)表于 07-15 07:41

    Keil C動態(tài)內(nèi)存管理機(jī)制分析及改進(jìn),不看肯定后悔

    Keil C動態(tài)內(nèi)存管理機(jī)制分析及改進(jìn),不看肯定后悔
    發(fā)表于 04-25 08:48

    怎么給RTOS動態(tài)分區(qū)內(nèi)存管理機(jī)制進(jìn)行優(yōu)化?

    怎么給RTOS動態(tài)分區(qū)內(nèi)存管理機(jī)制進(jìn)行優(yōu)化?
    發(fā)表于 04-28 06:17

    嵌入式系統(tǒng)所用到的內(nèi)存管理機(jī)制主要有哪幾種

    嵌入式系統(tǒng)所用到的內(nèi)存管理機(jī)制主要有以下兩種: 1、虛擬內(nèi)存管理機(jī)制: 有一些嵌入式處理器提供了MMU,在MMU具備內(nèi)存地址映射和尋址功能,
    發(fā)表于 12-17 06:34

    VxWorks內(nèi)存管理機(jī)制分析與研究

    實(shí)時性、可靠性是嵌入式開發(fā)對內(nèi)存管理的基本要求,本文探討了操作系統(tǒng)內(nèi)存管理的主要問題,對嵌入式操作系統(tǒng)Vxworks 的內(nèi)存
    發(fā)表于 01-07 12:35 ?23次下載

    linux內(nèi)存管理機(jī)制淺析

    本內(nèi)容介紹了arm linux內(nèi)存管理機(jī)制,詳細(xì)說明了linux內(nèi)核內(nèi)存管理,linux虛擬內(nèi)存管理
    發(fā)表于 12-19 14:09 ?73次下載
    linux<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理機(jī)制</b>淺析

    TMS320F28x 事件管理機(jī)制參考

    DSP之TMS320F28x事件管理機(jī)制參考,很好的DSP自學(xué)資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-15 14:48 ?15次下載

    最全SPARK內(nèi)存管理機(jī)制

    最全SPARK內(nèi)存管理機(jī)制
    發(fā)表于 09-08 14:17 ?5次下載
    最全SPARK<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理機(jī)制</b>

    嵌入式系統(tǒng)內(nèi)存管理機(jī)制詳解

    操作系統(tǒng)的內(nèi)存管理功能用于向操作系統(tǒng)提供一致的地址映射功能和內(nèi)存頁面的申請、釋放操作。在嵌入式實(shí)時系統(tǒng)中,內(nèi)存管理根據(jù)不同的系統(tǒng),有不同的策
    發(fā)表于 11-18 09:41 ?4762次閱讀

    驅(qū)動之路-內(nèi)存管理機(jī)制及mmap方法

    Linux 2.6.29內(nèi)核為每種CPU提供統(tǒng)一的界面,采用四級頁面管理構(gòu)架。來兼容二級、三級、四級管理架構(gòu)的CPU。通過頁式管理機(jī)制完成虛擬地址(線性地址)到物理地址的映射。一般每個頁大小為4K。cr3寄存器中保存了創(chuàng)建進(jìn)程時
    發(fā)表于 05-16 15:04 ?1089次閱讀
    驅(qū)動之路-<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理機(jī)制</b>及mmap方法

    嵌入式RTOS的內(nèi)存管理機(jī)制的實(shí)現(xiàn)方案和進(jìn)行改善設(shè)計

    。內(nèi)存資源作為嵌入式系統(tǒng)中極為重要的資源之一,其管理機(jī)制歷來是嵌入式系統(tǒng)設(shè)計的重點(diǎn)和難點(diǎn)。內(nèi)存管理機(jī)制的優(yōu)劣程度極大地影響著嵌入式系統(tǒng)的整體性能,因此在嵌入式RTOS的
    的頭像 發(fā)表于 08-12 09:03 ?2864次閱讀
    嵌入式RTOS的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理機(jī)制</b>的實(shí)現(xiàn)方案和進(jìn)行改善設(shè)計

    淺析物理內(nèi)存與虛擬內(nèi)存的關(guān)系及其管理機(jī)制

    本文主要介紹內(nèi)存管理機(jī)制:物理內(nèi)存與虛擬內(nèi)存的關(guān)系,Linux內(nèi)存管理機(jī)制,Python
    的頭像 發(fā)表于 04-12 09:55 ?6030次閱讀
    淺析物理<b class='flag-5'>內(nèi)存</b>與虛擬<b class='flag-5'>內(nèi)存</b>的關(guān)系及其<b class='flag-5'>管理機(jī)制</b>

    xenomai系統(tǒng)中的xnheap管理機(jī)制

    本文分析的enomai系統(tǒng)中的內(nèi)存池(xnheap)管理機(jī)制。
    的頭像 發(fā)表于 05-25 10:15 ?2105次閱讀

    深入理解Java 8內(nèi)存管理機(jī)制及故障排查實(shí)戰(zhàn)指南

    Java的自動內(nèi)存管理機(jī)制是由 JVM 中的垃圾收集器來實(shí)現(xiàn)的,垃圾收集器會定期掃描堆內(nèi)存中的對象,檢測并清除不再使用的對象,以釋放內(nèi)存資源。
    的頭像 發(fā)表于 04-04 08:10 ?1287次閱讀
    深入理解Java 8<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理機(jī)制</b>及故障排查實(shí)戰(zhàn)指南