編輯:關於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類。
ButterKnife的最新版本是8.4.0。首先,需要導入ButterKnife的jar包。在AndroidStudio中,File->Project Struc
在Android項目開發過程中,Android Studio是一款非常強大的開發工具。到底有多強大,用了你就知道了。本文我將介紹Studio引用Library開源項目與導
下載安裝好應用後,第一次打開會出現隱私許可協議,點擊接受後就會進入教程頁面,選擇跳過教程進入主頁面,可以看到它非常簡潔,整個Launcher只有主屏幕和應用
Android 的體系架構鼓勵組件重用,允許開發者發布共享 Activity、Service 並且訪問其他應用程序的數據,還可以根據開發者制定的安全限制