當前位置:首頁 » 安卓系統 » matAndroid

matAndroid

發布時間: 2025-02-28 23:38:00

Ⅰ 使用android MAT查看內存泄露問題,我查看了很多資料,為什麼在DDMS中沒有.hprof文件

如何用MAT來分析,前提是Android開發和測試的工具安裝完整,SDK,Eclipse:
1.打開Eclipse
2.選擇 Help->Install New Software;
3.在Work with中添加站點:http://download.eclipse.org/mat/1.0/update-site/(這個地址可能會變化,但是新的地址可以在官方網站上找到:http://www.eclipse.org/mat/downloads.php
4.生成.hprof文件:插入SD卡(Android機器很多程序都需要插入SD卡),並將設備連接到PC,在Eclipse中的DDMS中選擇要測試的進程,然後點擊Update Heap 和Dump HPROF file兩個Button。
.hprof 文件會自動保存在SD卡上,把 .hprof 文件拷貝到PC上的\ android-sdk-windows\tools目錄下。這個由DDMS生成的文件不能直接在MAT打開,需要轉換。
運行cmd打開命令行,cd到\ android-sdk-windows\tools所在目錄,並輸入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof為原始文件,yyyyy.hprof為轉換過後的文件。轉換過後的文件自動放在android-sdk-windows\tools 目錄下。
OK,到此為止,.hprof文件處理完畢,可以用來分析內存泄露情況了。
5.打開MAT:
在Eclipse中點擊Windows->Open Perspective->Other->Memory Analysis
6.導入.hprof文件
在MAT中點擊 File->Open File,瀏覽到剛剛轉換而得到的.hprof文件,並Cancel掉自動生成報告,點擊Dominator Tree,並按Package分組,選擇自己所定義的Package 類點右鍵,在彈出菜單中選擇List objects->With incoming references。

這時會列出所有可疑類,右鍵點擊某一項,並選擇Path to GC Roots->exclude weak/soft references,會進一步篩選出跟程序相關的所有有內存泄露的類。據此,可以追蹤到代碼中的某一個產生泄露的類。

Ⅱ android 中怎麼顯示mat類型的數據

千鋒扣丁學堂Android開發為您解答:
1、mat是matlab的數據文件,可以直接雙擊導入
或者通過命令窗輸入命令以及編寫m文件導入
如果是當前目錄下的文件file1.mat,直接輸入load file1
如果不是當前目錄下的,輸入 load(['目錄\file1.mat'])
如果file1里含有a,b,c這三個變數
導入後數據空間里,就直接存在a,b,c這三個量。
2、mat數據格式是matlab的數據存儲的標准格式。mat文件是標準的二進制文件,還可以ASCII碼形式保存和載入。
3、MATLAB是解釋型語言,就是說MATLAB命令行中敲入的命令在當前MATLAB進程中被解釋運行。但是,每次執行一個任務時敲入長長的命令序列是很煩人的。有兩種方法可以使MATLAB的力量得到擴展——腳本和函數。這兩種方法都用像emacs一樣的文本編輯器中編寫的m文件(因為擴展名是.m所以這樣命名,m文件還稱點m文件)。m文件的好處在於它可以保存命令,還可以輕易地修改命令而無需重新敲入整個命令行。

Ⅲ Android App內存優化

內存優化就是對內存問題的一個預防和解決,做內存優化能讓應用掛得少、活得好和活得久。

掛的少:
「掛」指的是 Crash,內存問題導致 Crash 的具體表現就是內存溢出異常 OOM。

活得好:
活得好指的是使用流暢,Android 中造成界面卡頓的原因有很多種,其中一種就是由內存問題引起的。內存問題之所以會影響到界面流暢度,是因為垃圾回收(GC,Garbage Collection),在 GC 時,所有線程都要停止,包括主線程,當 GC 和繪制界面的操作同時觸發時,繪制的執行就會被擱置,導致掉幀,也就是界面卡頓。

活得久:
活得久指的是我們的應用在後台運行時不會被幹掉。Android 會按照特定的機制清理進程,清理進程時優先會考慮清理後台進程。清理進程的機制就是LowMemoryKiller。在 Android 中不同的進程有著不同的優先順序,當兩個進程的優先順序相同時,低殺會優先考慮幹掉消耗內存更多的進程。也就是如果我們應用佔用的內存比其他應用少,並且處於後台時,我們的應用能在後台活下來,這也是內存優化為我們應用帶來競爭力的一個直接體現。

內存佔用是否越少越好?
當系統 內存充足 的時候,我們可以多用 一些獲得更好的性能。當系統 內存不足 的時候,我們希望可以做到 」用時分配,及時釋放「。內存優化並不能一刀切。

我們都知道,應用程序的內存分配和垃圾回收都是由Android虛擬機完成的,在Android 5.0以下,使用的是Dalvik虛擬機,5.0及以上,則使用的是ART虛擬機。
Android虛擬機Dalvik和ART

1、內存區域劃分

詳細請看以下兩篇文章(建議全看):
java內存四大區_JVM內存區域劃分
Android 內存機制

2、內存回收

垃圾收集的標記演算法(找到垃圾):

垃圾收集演算法(回收垃圾):

引用類型:強引用、軟引用、弱引用、虛引用

對象的有效性=可達性+引用類型

JAVA垃圾回收機制-史上最容易理解看這一篇就夠了
Android:玩轉垃圾回收機制與分代回收策略

android中還存在低殺機制,這種情況屬於系統整機內存不足,直接把應用進程殺掉的情況。

Android後台殺死系列:LowMemoryKiller原理

1、內存溢出
系統會給每個App分配內存空間也就是heap size值,當app佔用的內存加上申請的內存超過這個系統分配的內存限額,最終導致OOM(OutOfMemory)使程序崩潰。

通過命令 getprop |grep dalvik.vm.heapsize 可以獲取系統允許的最大
注意:在設置了heapgrowthlimit的狀況下,單個進程可用最大內存為heapgrowthlimit值。在android開發中,若是要使用大堆,須要在manifest中指定android:largeHeap為true,這樣dvm heap最大可達heapsize。
關於heapsize & heapgrowthlimit

2、內存泄漏
Android系統虛擬機的垃圾回收是通過虛擬機GC機制來實現的。GC會選擇一些還存活的對象作為內存遍歷的根節點GC Roots,通過對GC Roots的可達性來判斷是否需要回收。內存泄漏就是 在當前應用周期內不再使用的對象被GC Roots引用,造成該對象無法被系統回收,以致該對象在堆中所佔用的內存單元無法被釋放而造成內存空間浪費,使實際可使用內存變小。簡言之,就是 對象被持有導致無法釋放或不能按照對象正常的生命周期進行釋放。
Android常見內存泄漏匯總

3、內存抖動
指的是在短時間內大量的新對象被實例化,運行時可能無法承載這樣的內存分配,在這種情況下就會導致垃圾回收事件被大量調用,影響到應用程序的UI和整體性能,最終可能導致卡頓和OOM。
常見情況:在一些被頻繁調用的方法內不斷地創建對象。例如在View 的onDraw方法內new 一些新的對象。

注意內存抖動也會導致 OOM,主要原因有如下兩點:

1、Android Studio Profiler

作用

優點

內存抖動問題處理實戰

理解內存抖動的概念的話,我們就能明白只要能找到抖動過程中所產生的對象及其調用棧,我們就能解決問題,剛好Android Studio 的Porfiler裡面的Memory工具就能幫我們記錄下我們操作過程中或靜止界面所產生的新對象,並且能清晰看到這些對象的調用棧。

選擇Profile 中 的Memory ,選擇 Record Java/Kotlin allocations,再點擊Record開始記錄, Record Java/Kotlin allocations 選項會記錄下新增的對象。

操作完成之後,點擊如圖所示的紅腦按鈕,停止記錄。

停止記錄後,我們就可以排序(點擊 Allocations可以排序)看看哪些對象或基本類型在短時間被頻繁創建多個,點擊這些新增的對象就可以看到它的完成的調用鏈了,進而就找找到導致內存抖動的地方在哪裡了。

2、利用DDMS 和 MAT(Memory Analyzer tool)來分析內存泄漏

我們利用工具進行內存泄漏分析主要是用對比法:
a.先打開正常界面,不做任何操作,先抓取一開始的堆文件。
b.一頓胡亂操作,回到原來操作前的界面。主動觸發一兩次GC,過10秒再抓取第二次堆文件。
c.通過工具對比,獲取胡亂操作後新增的對象,然後分析這些新增的對象。

DDMS作用:抓取堆文件,主動觸發GC。(其實也是可以用Android Studio 的Profile裡面的Memory工具來抓取堆文件的,但是我這邊在利用Profile 主動觸發gc 的時候會導致程序奔潰,也不知道是不是手機的問題,所以沒用Android Studio的Profiler)

MAT作用:對堆文件進行對比,找到多出的對象,找到對象的強引用調用鏈。

以下是詳細的過程:

步驟1.打開DDMS,選擇需要調試的應用,打開初始界面,點擊下圖的圖標(Dump Hprof File)先獲取一次堆文件。

步驟2.對應用隨便操作後,回到一開始的界面,先多觸發幾次GC ,點擊下圖的圖標(Cause Gc)來主動觸發GC,然後再次點擊 Dump Hprof File 圖標來獲取堆文件。

步驟3.通過Android Studio Profile 或者 DDMS mp 的堆文件無法在MAT 打開,需要藉助android sdk包下的一個工具hprof-conv.exe來轉換。

格式為 hprof-conv 舊文件路徑名 要轉換的名稱;
例如:hprof-conv 2022-04-13_17-54-40_827.hprof change.hprof

步驟4.把兩份堆文件導入MAT,然後選擇其中第二次獲取的堆文件,點擊 如圖所示的 Histogram查看。

步驟5.點擊下圖圖標,Compare To Another Heap Dump ,選擇另一份堆文件。

6.會得出下圖所示的 Hitogram 展示,我們主要看Objects 這一列。 如下圖所示 「+ 2」 則代表前面兩份堆文件對比,這個對象多了兩個,我們主要就是要分析這些多了出來,沒有被回收的對象。

7.加入我們從增加的對象中,看到了MainActivity ,則需要從一開始打開的Hitogram 展示裡面找到這個對象的調用棧。如下圖所示,搜索MainActivity

8.看到下圖所示解僱,然後滑鼠右鍵點擊下圖紅色圈圈著的MainActivity ,選擇 Merger Shortest Paths to Gc Roots ,再選擇 exclude all phantom/weak/soft etc.references ,就可以看到這個MainActivity 對象的強引用鏈,至此我們就可以找到MainActivity對象是被什麼引用導致無法回收了。

3、內存泄露檢測神器之LeakCanary(線下集成)

自行學習了解,接入簡單,使用簡單,基本可以解決大部分內存泄漏問題。
github地址 : https://github.com/square/leakcanary/
學習地址 : https://square.github.io/leakcanary/changelog/#version-22-2020-02-05

針對內存抖動的建議:

針對內存泄漏問題的建議:

針對內存溢出問題的建議(主要就是要減少內存佔用):

建議參考:
深入探索 Android 內存優化(煉獄級別)

對於 優化的大方向,我們應該優先去做見效快的地方,主要有以下三部分:內存泄漏、內存抖動、Bitmap。完善監控機制也是我們的重點,能幫助我們對內存問題快速分析和處理。

參考:
深入探索 Android 內存優化(煉獄級別)

Ⅳ 如何在Android上使用OpenGL ES 2.0繪制點

如何在Android使用OpenGL
ES
2.0繪制點,看上去並不是一個復雜的問題,但是上網一搜,滿眼都是繪制點的代碼。
如果你看到類似如下代碼,基本上你已經掉坑裡了。
···
c
glBeging();
...
glDrawPoint(...);
...
glEnd();
```
如上是使用OpenGL
ES
1.0繪制點的代碼。因為架構不同,在OPENGL
ES
2.0的世界裡,這一套已經徹底不管用了。
在OpenGL
ES
2.0里繪制點,要使用Shader,使用Shader,用Shader。。。。。。
具體怎麼繪制呢,首先你要搞清楚,如何用Shader繪制一個普通帶顏色的三角形。我這里假設你已經會了。
三角形顯示出來的那一刻,你一定會有這樣的代碼:
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,
0,
vertexCount);
那麼,只顯示三角形的三個頂點該怎麼辦,說來簡單,這行代碼改成
GLES20.glDrawArrays(GLES20.GL_POINTS,
0,
vertexCount);
即可。
但是,理想和現實的差距總是很大,改完後三角形消失了但是頂點沒有出現。正常OpenGL
2.0環境下應該怎麼做呢?
1)首先調用
GL20.glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
這樣在Shader中可以訪問glPointSize;
2)然後類似准備每個頂點色彩那樣准備頂點的大小的數值,三角形是三個頂點,就准備3個float。把頂點數據像色彩數據那樣,綁定到VOB,再綁定到Shader的參數中。基本上就是照準備色彩那樣准備頂點大小數據,不同之處在於每個色彩4個float,每個頂點尺寸1個float。
3)最後,把你的頂點Shader文件改好,增加頂點大小的輸入參數和gl_PointSize賦值。
4)另外,如果你打算顯示圓形頂點,而不是方形的,還要用GL20.glEnable()函數設置其他參數,具體可查OpenGL官網。
比如:
uniform
mat4
matrix;
attribute
vec4
aVertex;
attribute
vec4
aColor;
attribute
float
aPointSize;
varying
vec4
vColor;
void
main(){
vColor
=
aColor;
gl_Position
=
matrix
*
aVertex;
gl_PointSize
=
aPointSize;
}
這樣,基本上就搞定了。
現在,坑爹的問題來了,在Android上你找不到GLES20.GL_VERTEX_PROGRAM_POINT_SIZE的常量,谷歌似乎認為在手機的3D環境下繪制點沒多大必要性,所以並沒有加上這個參數,好在預設情況下,模擬器中Shader中的gl_PointSize是打開的(Android
4.4.x)。所以你可以跳過第一步,直接傳遞點大小的參數,並把Shader改好就成。
那麼,為什麼你不寫gl_PointSize
=
aPointSize,點就顯示不出來呢。我估計預設情況下,gl_PointSize
=
0.0f,所以顯示不出來。
如果你顯示點的大小總是固定不變的,你甚至可以把傳遞頂點大小數值的步驟也省略掉,直接在Shader中寫上gl_PointSize
=
10.0f;即可。
閱讀本文,當你打算在Android上用OPENGL
ES
2.0顯示點時,即可跳過谷歌的那些坑了。我想,手機GPU硬體廠商的開發包應該對OpenGL
ES
2.0支持的更好些,比如高通的AdrenoSDK,建議大家下載嘗試。

Ⅳ 如何使用MAT分析Android應用內存泄露

開發Android應用時,經常會遇到內存溢出,內存泄露問題,這里介紹一種方法來檢測內存泄露。使用Android Studio,Android Device Monitor 配合Eclipse的MAT(Memory nalyzer)工具來分析android內存泄露。
http://jingyan..com/article/fec7a1e5f1c7291190b4e796.html

熱點內容
微信忘記解鎖密碼怎麼辦 發布:2025-03-01 04:18:16 瀏覽:593
順豐充值卡默認密碼多少 發布:2025-03-01 04:17:40 瀏覽:407
常用文獻資料庫有哪些 發布:2025-03-01 04:12:23 瀏覽:245
企業手機銀行u盾初始密碼是多少 發布:2025-03-01 04:12:22 瀏覽:924
冒險島怎麼提升伺服器 發布:2025-03-01 03:54:18 瀏覽:974
暢游動態密碼在哪裡 發布:2025-03-01 03:46:57 瀏覽:23
opgg用什麼密碼登錄的 發布:2025-03-01 03:46:57 瀏覽:868
viewpager源碼 發布:2025-03-01 03:42:09 瀏覽:736
解壓的兩字詞 發布:2025-03-01 03:34:52 瀏覽:542
java框架開源 發布:2025-03-01 03:33:27 瀏覽:51