android oom工具,Android OOM-Heap,MAT工具檢測內存泄露

概述

在android的開發中,要時刻主要內存的分配和垃圾回收,因為系統為每一個dalvik虛擬機分配的內存是有限的,在google的G1中,分配的最大堆大小只有16M,后來的機器一般都為24M,實在是少的可憐。這樣就需要我們在開發過程中要時刻注意。不要因為自己的代碼問題而造成OOM錯誤。

JAVA的內存管理

大家都知道,android應用層是由java開發的,android的davlik虛擬機與jvm也類似,只不過它是基于寄存器的。因此要了解android的內存管理就必須得了解java的內存分配和垃圾回收機制。

在java中,是通過new關鍵字來為對象分配內存的,而內存的釋放是由垃圾收集器(GC)來回收的,工程師在開發的過程中,不需要顯式的去管理內存。但是這樣有可能在不知不覺中就會浪費了很多內存,最終導致java虛擬機花費很多時間去進行垃圾回收,更嚴重的是造成JVM的OOM。因此,java工程師還是有必要了解JAVA的內存分配和垃圾回收機制。

內存結構

cc84a14b76a6

上面這張圖是JVM的結構圖,它主要四個部分組成:Class Loader子系統和執行引擎,運行時方法區和本地方法區,我們主要來看下RUNTIMEDATA AREA區,也就是我們常說的JVM內存。從圖中可以看出,RUNTIMEDATA AREA區主要由5個部分組成:

Method Area:被裝載的class的元信息存儲在Method Area中,它是線程共享的

Heap(堆):一個java虛擬機實例中只存在一個堆空間,存放一些對象信息,它是線程共享的

Java棧:java虛擬機直接對java棧進行兩種操作,以幀為單位的壓棧和出棧(非線程共享)

程序計數器(非線程共享)

本地方法棧(非線程共享)

JVM的垃圾回收(GC)

cc84a14b76a6

JVM的垃圾原理是這樣的,它把對象分為年輕代(Young)、年老代(Tenured)、持久代(Perm),對不同生命周期的對象使用不同的垃圾回收算法。

年輕代(Young)

年輕代分為三個區,一個eden區,兩個Survivor區。程序中生成的大部分新的對象都在Eden區中,當Eden區滿時,還存活的對象將被復制到其中一個Survivor區,當此Survivor區的對象占用空間滿了時,此區存活的對象又被復制到另外一個Survivor區,當這個Survivor區也滿了的時候,從第一個Survivor區復制過來的并且此時還存活的對象,將被復制到年老代。

年老代(Tenured)

年老代存放的是上面年輕代復制過來的對象,也就是在年輕代中還存活的對象,并且區滿了復制過來的。一般來說,年老代中的對象生命周期都比較長。

持久代(Perm)

用于存放靜態的類和方法,持久代對垃圾回收沒有顯著的影響。

Android中內存泄露監測

在了解了JVM的內存管理后,我們再回過頭來看看,在android中應該怎樣來監測內存,從而看在應用中是否存在內存分配和垃圾回收問題而造成內存泄露情況。

在android中,有一個相對來說還不錯的工具,可以用來監測內存是否存在泄露情況:DDMS—Heap

cc84a14b76a6

使用方法比較簡單:

選擇DDMS視圖,并打開Devices視圖和Heap視圖

點擊選擇要監控的進程,比如:上圖中我選擇的是system_process

選中Devices視圖界面上的"update heap"圖標

點擊Heap視圖中的"Cause GC"按鈕(相當于向虛擬機發送了一次GC請求的操作)

在Heap視圖中選擇想要監控的Type,一般我們會觀察dataobject的total size的變化,正常情況下total size的值會穩定在一個有限的范圍內,也就說程序中的代碼良好,沒有造成程序中的對象不被回收的情況。如果代碼中存在沒有釋放對象引用的情況,那么data object的total size在每次GC之后都不會有明顯的回落,隨著操作次數的增加而total size也在不斷的增加。(說明:選擇好data object后,不斷的操作應用,這樣才可以看出total size的變化)。如果totalsize確實是在不斷增加而沒有回落,說明程序中有沒有被釋放的資源引用。那么我們應該怎么來定位呢?

Android中內存泄露定位

Mat(memory analyzer tools)是我們常用的用來定位內存泄露的工具,如果你使用ADT,并且安裝了MAT的eclipse插件,你需要做的是進入DDMS視圖的Devices視圖:

cc84a14b76a6

點擊"dump HPROF file"按鈕,然后使用MAT分析下載下來的文件。

cc84a14b76a6

下面列出了存在的問題,點擊detail進去,會列出詳細的,可能會存在問題的代碼:

cc84a14b76a6

cc84a14b76a6

關于MAT的使用可以參考:

這位兄弟寫的比較詳細。

總結

不管是java還是android,都應該了解內存分配和垃圾回收機制,工程師要做到寫的代碼中沒有bad code很難,關鍵是在出現問題的時候該怎么去排查。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows 端微信多開

假設微信安裝目錄為 "E:\Program Files\WeChat\WeChat.exe" 打開記事本,復制一下命令,保存為 bat 文件 echo off start /d "E:\Program Files\WeChat\" WeChat.exe start /d "E:\Program Files\WeChat\" WeChat.exe exi…

超詳細MFS網絡分布式文件系統

-----------------------MFS---------------------- (1)分布式原理 分布式文件系統( Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點相連。簡單來說,就是把一些分散的(分布在局域網內各個…

markdown文件轉word文件

工具: https://github.com/jgm/pandoc/releases/tag/2.2.3.2 下載pandoc安裝包之后,像安裝普通軟件一樣點開安裝就可以了。安裝完成之后,打開cmd命令行,輸入pandoc -v,如果正常顯示出類似下面的信息就表明安裝成功&a…

android全面屏系統哪個版本開始,Android全面屏

所謂全面屏手機,就是屏幕縱橫比大于1.86的設備。例如:舉個例子.png官方文檔:If your app targets Android 8.0 (API level 26) or higher, it fills the entire screen, according to its layout.If your app targets Android 7.1 (API level…

AliOS Things聲源定位應用演示

摘要: 1. 概述 利用麥克風陣列進行聲源定位在智能降噪、語音增強、語音識別等領域有廣泛應用和研究前景。本文介紹基于AliOS Things STM32F413H Discovery開發板實現聲源定位算法集成和功能演示。 概述利用麥克風陣列進行聲源定位在智能降噪、語音增強、語音識別等…

Mysql 使用正則表達式

需求:匹配出姓名字段里非中文的 SELECT * FROM 表 WHERE REAL_NAME REGEXP ([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z\\.\\s]{1,20}) ; 查詢結果如下

Android點擊返回鍵銷毀自己,Activity界面銷毀 軟鍵盤未收回

在項目開發過程中,界面包含EditText輸入框時,輸入內容時軟鍵盤彈起。但是此時我們調用界面中自定義的返回按鈕執行.finish()方法銷毀Activity后發現軟鍵盤并沒有跟隨關閉收回,參考了網上各種方法后,試驗總結出自己項目中可用的方案…

2、Collections操作(自定義類)的各種實現

2019獨角獸企業重金招聘Python工程師標準>>> 1、排序(sort) 要想實現排序,必須實現compare方法,這樣Collection才知道是怎樣的排序規則。普通的數據類型,比如:int 、String、long等都已經實現了Comparable接口&#xf…

Mysql sql語句積累

分組排序 #alter table zxfw_offline_qa add zx_number varchar(50) COMMENT 咨詢編號,提問日期提問順序 AFTER id;/* select (i : case when pre_consult_timeconsult_time then i 1 else 1 end ) rownum, qa.*,(pre_consult_time:consult_time) from zxfw_…

中綴表達式轉換成后綴表達式(只適用于加減乘除運算)

1 #include <iostream>2 #include <stack>3 #include <cctype>4 5 using namespace std;6 7 //獲取符號的優先級8 int getPriority(char c)9 { 10 int priority -1; 11 switch (c) { 12 case : 13 priority 1; 14 break; 15 …

android多接口請求參數,okhttp3 使用json參數post方式請求接口數據(android)

1. 谷歌自帶的json不支持像map一樣直接put字符串進去&#xff0c;所以先導入阿里的json包2. 創建json對象&#xff0c;并且放入所要請求的參數 //登錄 private void loginRequest() { String url Contents.url"login"; JSONObject json new JSONObject(); json.put…

由淺入深,一文掌握NGINX知識文集

&#x1f3c6;作者簡介&#xff0c;普修羅雙戰士&#xff0c;一直追求不斷學習和成長&#xff0c;在技術的道路上持續探索和實踐。 &#x1f3c6;多年互聯網行業從業經驗&#xff0c;歷任核心研發工程師&#xff0c;項目技術負責人。 &#x1f389;歡迎 &#x1f44d;點贊?評論…

MySQL not in查詢不出數據(MySQL not in 無效)

今天使用 MySQL 的 not in 進行查詢的時候&#xff0c;發現結果里面并沒有返回任何數據。SQL 語句沒有任何問題&#xff0c;但是結果集卻是空&#xff0c;實在無法理解。糾結了半天&#xff0c;最后使用 left join&#xff0c;兩表關聯&#xff0c;找到了目標數據。但是這樣的話…

Python語法特點如注釋規則、代碼縮進、編碼規范等

在Python中&#xff0c;通常包括3種類型的注釋&#xff0c;分別是單行注釋、多行注釋和中文編碼聲明注釋。單行注釋在Python中&#xff0c;使用“#”作為單行注釋的符號。從符號“#”開始直到換行為止&#xff0c;“#”后面所有的內容都作為注釋的內容&#xff0c;并被Python編…

修改android.jar教程,Android修改jar包文件

1、Android studio中新建java文件&#xff0c;取和將要修改的文件相同的文件名&#xff0c;把class文件中代碼復制過去&#xff0c;修改需要改動的代碼2、新建txt文件&#xff0c;將新建的Java文件按照依賴關系將路經添加到新建的txt文件中&#xff0c;被依賴的放在最前面(ps:此…

安卓市場上架總結

安卓上架截圖&#xff08;不要帶手機外觀&#xff09; 注意&#xff1a;截圖不能有二維碼小米 至少3張&#xff0c;480*854像素&#xff0c;JPG、PNG格式。騰訊應用寶 請上傳2-5張截圖&#xff08;尺寸保持一致&#xff09;&#xff0c;單張圖片不超過1M。截圖不能小于320*480像…

android 左右分欄聯動布局,Layout 布局(24 分欄)

基礎布局使用單一分欄創建基礎的柵格布局(:span“0~24”).el-row {margin-bottom: 20px;&:last-child {margin-bottom: 0;}}.el-col {border-radius: 4px;}.bg-purple-dark {background: #99a9bf;}.bg-purple {background: #d3dce6;}.bg-purple-light {background: #e5e9f2…

洛谷P4238 【模板】多項式求逆(NTT)

傳送門 學習了一下大佬的->這里 已知多項式$A(x)$&#xff0c;若存在$A(x)B(x)\equiv 1\pmod{x^n}$ 則稱$B(x)$為$A(x)$在模$x^n$下的逆元&#xff0c;記做$A^{-1}(x)$ 具體的來說的話&#xff0c;就是兩個多項式$A,B$相乘模$x^n$之后&#xff0c;所有次數大于等于$n$的項都…

win10安裝TortoiseGit

TortoiseGit 是Git的可視化工具。所以前提是已經安裝了Git&#xff0c;安裝很簡單一路next。 下載地址&#xff0c;百度搜“TortoiseGit”&#xff0c;一般是第一個。 目前地址是&#xff1a;https://tortoisegit.org/download/ 如果打不開&#xff0c;可以進入騰訊軟件中心…

CF1045G AI robots(動態開點線段樹)

題意 火星上有$N$個機器人排成一行&#xff0c;第$i$個機器人的位置為$x_{i}$&#xff0c;視野為$r_{i}$&#xff0c;智商為$q_{i}$。我們認為第$i$個機器人可以看到的位置是$[x_{i}-r_{i},x_{i}r_{i}]$。如果一對機器人相互可以看到&#xff0c;且它們的智商$q_{i}$的差距不大…