国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android 之 內(nèi)存管理

概述

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

JAVA的內(nèi)存管理

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

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

  1. 內(nèi)存結構

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

  • Method Area:被裝載的class的元信息存儲在Method Area中,它是線程共享的
  • Heap():一個java虛擬機實例中只存在一個堆空間,存放一些對象信息,它是線程共享的
  • Java棧: java虛擬機直接對java棧進行兩種操作,以幀為單位的壓棧和出棧(非線程共享)
  • 程序計數(shù)器(非線程共享)
  • 本地方法棧(非線程共享)
  1. JVM的垃圾回收(GC

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

  • 年輕代(Young)

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

  • 年老代(Tenured

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

  • 持久代(Perm

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

Android內(nèi)存泄露監(jiān)測

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

android中,有一個相對來說還不錯的工具,可以用來監(jiān)測內(nèi)存是否存在泄露情況:DDMSHeap

使用方法比較簡單:

  • 選擇DDMS視圖,并打開Devices視圖和Heap視圖
  • 點擊選擇要監(jiān)控的進程,比如:上圖中我選擇的是system_process
  • 選中Devices視圖界面上的"update heap" 圖標
  • 點擊Heap視圖中的"Cause GC" 按鈕(相當于向虛擬機發(fā)送了一次GC請求的操作)

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

Android中內(nèi)存泄露定位

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

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

 

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

 

關于MAT的使用可以參考:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html

這位兄弟寫的比較詳細。

總結

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

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java 堆內(nèi)存溢出梗概分析
Android程序的內(nèi)存泄漏與規(guī)避方法
jvm介紹(很好的一篇文章)
JVM調(diào)優(yōu)
JVM優(yōu)化配置(轉)
探究JVM內(nèi)存泄露
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服