自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android性能優(yōu)化之內(nèi)存篇

移動開發(fā) Android
Google近期在Udacity上發(fā)布了Android性能優(yōu)化的在線課程,分別從渲染,運算與內(nèi)存,電量幾個方面介紹了如何去優(yōu)化性能,這些課程是Google之前在Youtube上發(fā)布的Android性能優(yōu)化典范專題課程的細化與補充。

Google近期在Udacity上發(fā)布了Android性能優(yōu)化的在線課程,分別從渲染,運算與內(nèi)存,電量幾個方面介紹了如何去優(yōu)化性能,這些課程是Google之前在Youtube上發(fā)布的Android性能優(yōu)化典范專題課程的細化與補充。

下面是內(nèi)存篇章的學(xué)習(xí)筆記,部分內(nèi)容與前面的性能優(yōu)化典范有重合,歡迎大家一起學(xué)習(xí)交流!

 

1)Memory, GC, and Performance

 

眾所周知,與C/C++需要通過手動編碼來申請以及釋放內(nèi)存有所不同,Java擁有GC的機制。Android系統(tǒng)里面有一個Generational Heap Memory的模型,系統(tǒng)會根據(jù)內(nèi)存中不同的內(nèi)存數(shù)據(jù)類型分別執(zhí)行不同的GC操作。例如,最近剛分配的對象會放在Young Generation區(qū)域,這個區(qū)域的對象通常都是會快速被創(chuàng)建并且很快被銷毀回收的,同時這個區(qū)域的GC操作速度也是比Old Generation區(qū)域的GC操作速度更快的。

除了速度差異之外,執(zhí)行GC操作的時候,所有線程的任何操作都會需要暫停,等待GC操作完成之后,其他操作才能夠繼續(xù)運行。

通常來說,單個的GC并不會占用太多時間,但是大量不停的GC操作則會顯著占用幀間隔時間(16ms)。如果在幀間隔時間里面做了過多的GC操作,那么自然其他類似計算,渲染等操作的可用時間就變得少了。

 

2)Memory Monitor Walkthrough

 

Android Studio中的Memory Monitor可以很好的幫助我們查看程序的內(nèi)存使用情況。

3)Memory Leaks

內(nèi)存泄漏表示的是不再用到的對象因為被錯誤引用而無法進行回收。

發(fā)生內(nèi)存泄漏會導(dǎo)致Memory Generation中的剩余可用Heap Size越來越小,這樣會導(dǎo)致頻繁觸發(fā)GC,更進一步引起性能問題。

舉例內(nèi)存泄漏,下面init()方法來自某個自定義View:

 

 

  1. private void init() { 
  2. ListenerCollector collector = new ListenerCollector(); 
  3. collector.setListener(this, mListener); 

上面的例子容易存在內(nèi)存泄漏,如果activity因為設(shè)備翻轉(zhuǎn)而重新創(chuàng)建,自定義的View會自動重新把新創(chuàng)建出來的mListener給綁定到ListenerCollector中,但是當activity被銷毀的時候,mListener卻無法被回收了。

 

4)Heap Viewer Walkthrough

 

下圖演示了Android Tools里面的Heap Viewer的功能,我們可以看到當前進程中的Heap Size的情況,分別有哪些類型的數(shù)據(jù),占比是多少。

5)Understanding Memory Churn

Memory Churn內(nèi)存抖動,內(nèi)存抖動是因為在短時間內(nèi)大量的對象被創(chuàng)建又馬上被釋放。瞬間產(chǎn)生大量的對象會嚴重占用Young Generation的內(nèi)存區(qū)域,當達到閥值,剩余空間不夠的時候,會觸發(fā)GC從而導(dǎo)致剛產(chǎn)生的對象又很快被回收。即使每次分配的對象占用了很少的內(nèi)存,但是他們疊加在一起會增加Heap的壓力,從而觸發(fā)更多其他類型的GC。這個操作有可能會影響到幀率,并使得用戶感知到性能問題。

解決上面的問題有簡潔直觀方法,如果你在Memory Monitor里面查看到短時間發(fā)生了多次內(nèi)存的漲跌,這意味著很有可能發(fā)生了內(nèi)存抖動。

同時我們還可以通過Allocation Tracker來查看在短時間內(nèi),同一個棧中不斷進出的相同對象。這是內(nèi)存抖動的典型信號之一。

當你大致定位問題之后,接下去的問題修復(fù)也就顯得相對直接簡單了。例如,你需要避免在for循環(huán)里面分配對象占用內(nèi)存,需要嘗試把對象的創(chuàng)建移到循環(huán)體之外,自定義View中的onDraw方法也需要引起注意,每次屏幕發(fā)生繪制以及動畫執(zhí)行過程中,onDraw方法都會被調(diào)用到,避免在onDraw方法里面執(zhí)行復(fù)雜的操作,避免創(chuàng)建對象。對于那些無法避免需要創(chuàng)建對象的情況,我們可以考慮對象池模型,通過對象池來解決頻繁創(chuàng)建與銷毀的問題,但是這里需要注意結(jié)束使用之后,需要手動釋放對象池中的對象。

 

6)Allocation Tracker

 

關(guān)于Allocation Tracker工具的使用,不展開了,參考下面的鏈接:

http://developer.android.com/tools/debugging/ddms.html#alloc

 

http://android-developers.blogspot.com/2009/02/track-memory-allocations.html

 

7)Improve Your Code To Reduce Churn

下面演示一個例子,如何通過修改代碼來避免內(nèi)存抖動。優(yōu)化之前的內(nèi)存檢測圖:

定位代碼之后,修復(fù)了String拼接的問題:

優(yōu)化之后的內(nèi)存監(jiān)測圖:

 

8)Recap

上面提到了三種測量內(nèi)存的工具,下面再簡要概括一下他們各自的特點:

Memory Monitor:跟蹤整個app的內(nèi)存變化情況。

 

Heap Viewer:查看當前內(nèi)存快照,便于對比分析哪些對象有可能發(fā)生了泄漏。

 

Allocation Tracker:追蹤內(nèi)存對象的來源。

 

 

 

責(zé)任編輯:chenqingxiang 來源: 胡凱的博客
相關(guān)推薦

2016-12-22 17:21:11

Android性能優(yōu)化內(nèi)存泄漏

2017-03-14 18:48:06

Android性能優(yōu)化內(nèi)存優(yōu)化

2015-09-16 15:48:55

Android性能優(yōu)化電量

2015-09-16 14:37:50

Android性能優(yōu)化運算

2015-09-16 13:54:30

Android性能優(yōu)化渲染

2011-04-25 14:06:23

java

2011-12-28 13:38:00

JavaJVM

2011-02-22 14:47:52

SQL Server資

2011-02-28 08:57:10

SQL Server資內(nèi)存性能調(diào)優(yōu)

2021-07-05 14:55:28

前端優(yōu)化圖片

2010-12-22 13:14:52

Linux性能監(jiān)測

2019-03-15 15:00:49

Webpack構(gòu)建速度前端

2023-06-12 00:22:50

操作系統(tǒng)應(yīng)用程序內(nèi)核鎖

2011-06-20 13:35:01

網(wǎng)站優(yōu)化

2021-08-02 10:50:57

性能微服務(wù)數(shù)據(jù)

2017-12-14 14:32:30

.Net內(nèi)存代碼

2024-01-03 08:20:05

Java字符串性能

2013-09-16 15:16:20

Android性能優(yōu)化

2021-07-29 14:20:34

網(wǎng)絡(luò)優(yōu)化移動互聯(lián)網(wǎng)數(shù)據(jù)存儲

2018-07-18 12:12:20

Spark大數(shù)據(jù)代碼
點贊
收藏

51CTO技術(shù)棧公眾號