編輯:關於Android編程
垃圾回收包含兩個過程:
判定階段,也就是判斷哪些對象可以被回收, 收集階段,是指具體的回收策略。判定階段主要有兩種方式
引用計數,對象每多一個引用計數加1,少一個引用計數減1,計數為0時就表示這個對象可以被回收了。但是引用計數有個缺點,不能判斷循環應用的情況,所以就有了下面的方式 根搜索,從一些根對象(GCRoot)開始遍歷搜索,如果一個對象無法被搜索到,說明這個對象可以被回收了。1 一些虛擬機棧中的對象;2 方法區中的類靜態屬性對象;3 方法區中的常量對象;4 Native棧中JNI的引用對象
收集階段主要有四種方式
標記清除,最簡單的算法,講標記好的對象直接清除,速度快,但效率不高,內存碎片 復制算法,每次使用可用內存的一半,收集時將可用對象復制到另一半內存,回收這一半 標記整理,將存活對象整理到內存區域的一端,剩余部分回收 分代回收,將內存區域按對象存活周期劃分為青年代和老年代等,不同區域采用上面不同的收集算法。Android5.0 之前使用Dalvik虛擬機,之後使用ART虛擬機,下面是一些比較:
Dalvik在運行時將字節碼轉換為機器碼,ART在安裝的時候就轉換為機器碼,這樣安裝好的應用會占用更大的空間,但是運行時少了轉換的時間,所以運行更快 ART提供了更好的垃圾回收表現,將垃圾回收時,程序的暫停次數由兩次(分析、清理)減少到一次;程序暫停時,並行的進行垃圾回收處理;回收新近分配的、生命期短的對象,垃圾回收器花費的時間更少
Allocation Tracking是DDMS中提供內存工具,用來顯示一段時間內的內存分配情況。
選擇要跟蹤的進程名,點擊Start Tracking開始跟蹤,做一些操作後點擊Get Allocations就可以將這段操作中新分配的對象顯示出來,點擊具體的對象可以在下面看到是哪一個方法分配的這個對象。
Heap Tool可以查看當前的內存快照
從數據裡可以看到當前內存的占用和回收情況,每次垃圾回收這裡的數據都會更新,因為會不斷獲取內存數據刷新顯示,所以這時候對應用操作會出現卡頓。
Heap Tool提供的是一個內存的總體情況,圖表顯示的內容比較簡單,如果要具體分析的話最好生成.hprof文件,使用MAT工具進行分析。
關於MAT工具的使用已經有很多介紹,google官方曾經寫過一個使用介紹http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html,推薦一個中文博客,
http://blog.csdn.net/guolin_blog/article/details/42238633,寫的很好。
一般用到MAT工具分析內存都是因為發生了應用發生了內存洩漏,需要自己去分析可能洩漏的地方,然後用MAT工具去驗證。而最近Square公司開源了一個內存洩漏檢測項目LeakCanary,極大地簡化了這個過程,可以說是Android內存洩漏檢測的終極利器。
A memory leak detection library for Android and Java.
項目地址:https://github.com/square/leakcanary
LeakCanary會檢測應用的內存回收情況,如果發現有垃圾對象沒有被回收,就會去分析當前的內存快照,也就是上邊MAT用到的.hprof文件,找到對象的引用鏈,並顯示在頁面上。
使用:
在build.gradle文件中添加
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
在應用的Application onCreate方法中添加LeakCanary.install(this)
,如下
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
從2012年自學Android開始,到現在第4個年頭了,期間一直沒接觸正規的Android項目,加上這幾年一直忙.NET項目,導致去年有兩單Android的私活沒底氣接,
在我們現在開發APP過程中,當用戶注冊時,短信驗證是必不可少的操作,這裡我們就是用一個免費的第三方短信驗證SDK-MOP首先看下效果圖 獲取AppKey和AppSecre
Android Fragment的回退棧點開之後按一次回退鍵只返回一次MainActivity 類public class MainActivity exte
如果說評價一下哪個圖片開源庫最被廣泛使用的話,我想應該可以說是Universal-Image-Loader,在主流的應用中如果你隨便去反編譯幾個,基本都能看到他的身影,它