編輯:Android開發實例
概述
在android的開發中,要時刻主要內存的分配和垃圾回收,因為系統為每一個dalvik虛擬機分配的內存是有限的,在google的G1中,分配的最大堆大小只有16M,後來的機器一般都為24M,實在是少的可憐。這樣就需要我們在開發過程中要時刻注意。不要因為自己的代碼問題而造成OOM錯誤。
JAVA的內存管理
大家都知道,android應用層是由java開發的,android的davlik虛擬機與jvm也類似,只不過它是基於寄存器的。因此要了解android的內存管理就必須得了解java的內存分配和垃圾回收機制。
在java中,是通過new關鍵字來為對象分配內存的,而內存的釋放是由垃圾收集器(GC)來回收的,工程師在開發的過程中,不需要顯式的去管理內存。但是這樣有可能在不知不覺中就會浪費了很多內存,最終導致java虛擬機花費很多時間去進行垃圾回收,更嚴重的是造成JVM的OOM。因此,java工程師還是有必要了解JAVA的內存分配和垃圾回收機制。
上面這張圖是JVM的結構圖,它主要四個部分組成:Class Loader子系統和執行引擎,運行時方法區和本地方法區,我們主要來看下RUNTIME DATA AREA區,也就是我們常說的JVM內存。從圖中可以看出,RUNTIMEDATA AREA區主要由5個部分組成:
JVM的垃圾原理是這樣的,它把對象分為年輕代(Young)、年老代(Tenured)、持久代(Perm),對不同生命周期的對象使用不同的垃圾回收算法。
年輕代分為三個區,一個eden區,兩個Survivor區。程序中生成的大部分新的對象都在Eden區中,當Eden區滿時,還存活的對象將被復制到其中一個Survivor區,當此Survivor區的對象占用空間滿了時,此區存活的對象又被復制到另外一個Survivor區,當這個Survivor區也滿了的時候,從第一個Survivor區復制過來的並且此時還存活的對象,將被復制到年老代。
年老代存放的是上面年輕代復制過來的對象,也就是在年輕代中還存活的對象,並且區滿了復制過來的。一般來說,年老代中的對象生命周期都比較長。
用於存放靜態的類和方法,持久代對垃圾回收沒有顯著的影響。
Android中內存洩露監測
在了解了JVM的內存管理後,我們再回過頭來看看,在android中應該怎樣來監測內存,從而看在應用中是否存在內存分配和垃圾回收問題而造成內存洩露情況。
在android中,有一個相對來說還不錯的工具,可以用來監測內存是否存在洩露情況:DDMS—Heap
使用方法比較簡單:
在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視圖:
點擊"dump HPROF file"按鈕,然後使用MAT分析下載下來的文件。
下面列出了存在的問題,點擊detail進去,會列出詳細的,可能會存在問題的代碼:
關於MAT的使用可以參考:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html
這位兄弟寫的比較詳細。
總結
不管是java還是android,都應該了解內存分配和垃圾回收機制,工程師要做到寫的代碼中沒有bad code很難,關鍵是在出現問題的時候該怎麼去排查。
本文主要講解Android應用程序簽名相關的理論知識,包括:什麼是簽名、為什麼要給應用程序簽名、如何給應用程序簽名等。 1、什麼是簽名? &
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
一、軟鍵盤介紹 實現軟鍵盤主要用到了系統的兩個類:Keyboard和KeyboardView。 Keyboard類源碼的介紹是: Listene