現在的位置: 首頁 > 綜合 > 正文

android 內存管理

2018年06月09日 ⁄ 綜合 ⁄ 共 1622字 ⁄ 字型大小 評論關閉

一、內存管理

概述

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

JAVA的內存管理

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

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

  1. 內存結構

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

  • 方法區(Method Area):存放類信息,如類方法、變數信息,靜態變數、final類型變數、屬性和方法信息
  • 堆(Heap):通過new創建的對象內存都在堆中分配
  • 棧(java stack):執行方法時,在棧中申請一個棧幀,這一個棧幀里包括:局部變數區和操作數棧。用來存放方法調用過程中的臨時變數、參數和中間結果。 java虛擬機直接對java棧進行兩種操作,以幀為單位的壓棧和出棧。
  • JVM內存組成結構
  • 本地方法棧(native method stack):用於支持native方法的執行,存儲了每個native方法調用的狀態,就是分配JNI調用內存
  • 程序計數器:對應用計數

 

堆內存釋放條件:對new一個對象,分配了堆內存,在棧中會有一個引用,以便程序使用該對象,同時程序計數器會對該對象的引用計數,每引用一次,引用計數器加1,當一個引用離開了它的生命周期則引用計數減1,如果一個引用使用完一個對象,但一直沒離開它的生命周期,就會OOM,所以要主動置null;當一個對象的引用技術為0時,就符合被GC的條件。

二、深入理解JVM堆與JVM棧

JVM棧解決程序的運行問題,即程序如何執行,或者說如何處理數據;JVM堆解決的是數據存儲的問題,即數據怎麼放、放在哪兒,另外JVM堆中存的是對象。JVM棧中存的是基本數據類型和JVM堆中對象的引用。

JVM基礎概念:JVM堆與JVM棧

數據類型

Java虛擬機中,數據類型可以分為兩類:基本類型和引用類型。基本類型的變數保存原始值,即:他代表的值就是數值本身;而引用類型的變數保存引用值。「引用值」代表了某個對象的引用,而不是對象本身,對象本身存放在這個引用值所表示的地址的位置。

基本類型包括:byte,short,int,long,char,float,double,Boolean,returnAddress

引用類型包括:類類型,介面類型和數組。

JVM堆與JVM棧

JVM堆和JVM棧是程序運行的關鍵,很有必要把他們的關係說清楚。

JVM堆和JVM棧

JVM棧是運行時的單位,而JVM堆是存儲的單位。

JVM棧解決程序的運行問題,即程序如何執行,或者說如何處理數據;JVM堆解決的是數據存儲的問題,即數據怎麼放、放在哪兒。

在Java中一個線程就會相應有一個線程JVM棧與之對應,這點很容易理解,因為不同的線程執行邏輯有所不同,因此需要一個獨立的線程JVM棧。而JVM堆則是所有線程共享的。JVM棧因為是運行單位,因此裡面存儲的信息都是跟當前線程(或程序)相關信息的。包括局部變數、程序運行狀態、方法返回值等等;而JVM堆只負責存儲對象信息。

 

抱歉!評論已關閉.