Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android程序優化-----JAVA類的生命周期

Android程序優化-----JAVA類的生命周期

編輯:關於Android編程

前言:

虛擬機、類在內存中干了什麼?這是對程序優化的前提知識吧!想寫個程序優化的系列文章,主要寫的通俗些讓人一看就懂,當然嚴謹性就降低了。畢竟我不太可能開發虛擬機嘛!如果要自己研究還是看《深入理解Java虛擬機》這本神書吧。吐三升血來推薦這本書,這本書把.class文件、虛擬機構造、如何執行、如何優化講的淋漓盡致。

 

虛擬機構造:

運行時數據區域(JAVA虛擬機在內存中劃分的幾個區域):

你想想啊!我們寫的.java文件編譯後形成.class文件。java中的類名A、方法名、常量CONSTANT和方法中的邏輯會全部映射到.class文件中,而加載.class文件到虛擬機內存中,內存中肯定也會存儲這些信息。那麼內存中是在那裡存儲這些信息呢? 實際上這個過程就是層層篩檢,將人類易理解的冗余信息---》到機器能理解的極端簡潔信息0101。

示例:

 

	public class A{
		private int a = 3;
		public static final int CONSTANT = 32;
	}

 

 

	public class B{
		static{
			System.out.println(A.CONSTANT);
			}
	}

 

1.堆(heap)

占內存最大的一塊。存儲信息

a)類對象的字段值:如A類對象a屬性的值3。(對象不同而字段數值不同的信息,所以CONSTANT不在這裡存儲,因為所有的A類對象都只有一個值32)

b)方法區中存儲該類不變信息的地址(A類對象不變化的信息是:字段名稱a,類名稱A,修飾符private。你有N個對象,類的字段名稱也不會變嘛)

2.方法區(Method Area)

存儲信息:

a)類不變信息:字段名稱a,類名稱A,修飾符private

b)運行時常量池(Runtime Constant Pool)用於存儲編譯期間生成的符號引用、字面常量。 (比如說.class文件字節碼中用#1代表CONSTANT屬性值3)

//-----------------------------以上是線程公有的-------------------------

3.JAVA虛擬機棧

棧中有棧幀(Stack Heap),存儲局部變量表、操作棧、動態鏈接、方法出口等信息

4.本地方法棧

和虛擬機棧類似,只是描述的是修飾符為native的本地方法。

5.直接內存

6.程序計數器

記錄程序進行到字節碼行數。

 

 

要優化,就得先知道類在內存中怎麼運行的。

類生命周期:

加載(Loading)--》驗證(Verification)--》准備(Preparation)---》解析(Resolution)--》初始化(Initiation)---》使用(Using)----》卸載(Unloading)。 其中標黃的驗證---》准備---》解析被稱為連接(Linking)。

(Android自帶的proGuard有個功能叫做preVerification,Android上這個功能是被屏蔽的。在Java Micro Edition 和 Java 6把驗證給分開了,在編譯期間就可以進行預驗證(preVerification))

其中加載和連接階段是不會執行我們寫的代碼的(除非你重寫類加載器),初始化階段才開始。

 

加載:

1)通過類的全限定名(包名+類名)獲取此類的二進制文件

2)類的靜態存儲結構(.class文件中描繪的方法、字段、修飾符)轉換為 方法區 運行時數據結構

3)在Java堆中生成一個代表改類的java.lang.Class對象,作為方法區的訪問入口

 

JAVA常量static加上final,則編譯期間直接用32代替CONSTANT。換句話說在B的運行中沒有加載A類,來讀取CONSTANT變量,而是引用了B自身的常量池CONSTANT。這樣就省內存,因為沒有加載A類。

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved