什麼是class文件?java
可以被jvm識別,加載並執行的文件格式android
如何生成一個class文件算法
class文件的做用 記錄類文件的全部信息(記錄了this super 等關鍵字)緩存
class文件弊端服務器
什麼是dex文件app
被DVM虛擬機識別,加載並執行的文件格式jvm
如何生成dex文件ide
javac -target 1.6 -source 1.6 Test.java
生成class文件。ps:指定1.6 版本爲了保證兼容dx --dex --output=Test.dex com/example/hostfit/Test.class
ps: 是根據全類名來找的adb push Test.dex '手機路徑(例如:/sdcard)'
dalvikvm -cp Test.dex com.example.hostfit.Test
ps: 注意全類名dex文件的做用ui
記錄整個工程中全部類文件的信息。
java 虛擬機結構解析
java代碼的編譯和執行過程
Java 內存管理
Java 棧區
用來存放Java方法執行的全部數據 ps: method call-> a -> b - c;棧區由棧幀組成,一個棧幀表明一個方法的執行。
那什麼是棧幀呢?每個方法從調用到執行完成就對應一個棧幀在虛擬機中入棧到出棧。每個棧幀包括局部變量表、棧操做數、動態連接、方法出口。例如(StackOverFlow異常)
本地方法棧:和Java方法棧一模一樣,只不過本地方法棧是專門爲Native方法服務的
方法區
存儲被虛擬機加載的類信息,常量,靜態變量,便是編譯器後等數據,用於佔據內存的
Java堆
全部經過New建立的對象的內存都在堆中分配,是虛擬機中最大的一塊內存,是GC 要回收的部分
特色:Young Old Generation 能夠動態分配,當咱們的服務器處理的是及時通信相關服務,就能夠將Young Generation內存區域調整大一些;當咱們不須要頻繁去建立對象的時候,能夠將Young Generation 內存區域調整小一些,這樣達到內存對象常駐的效果
Java 內存回收機制
垃圾回收算法
引用類型
強引用、弱引用、軟引用、虛引用
如何回收垃圾
觸發回收機制
Dalvik 與 jvm的不一樣
ART比Dalvik有哪些優點
類是如何加載到虛擬機的?
Java 中的ClassLoader回顧
Android中ClassLoader 做用詳解
Android ClassLoader的種類
BootsClassLoader
用來加載Android framework層的一些dex文件
PathClassLoader
用來加載已經安裝到系統中的apk文件中的dex文件
DexClassLoader
用來加載指定目錄中dex文件
BaseDexClassLoader
是PathClassLoader DexClassLoader 的父類
一個App至少須要BootClassLoader 和PathClassLoader
Android ClassLoader 的特色
雙親代理模型特色
當前的classLoader去加載此類,若是當前此類已經被ClassLoader加載過就再也不加載,直接返回; 若是未加載,便會查詢它的Parents 是否加載過此類,若是加載過 就返回parents加載過的字節碼文件; 若是整個繼承線的都沒有加載過此類,便會子類真正的加載,提升類加載效率。這樣就會帶來如下兩個做用
類加載的共享功能 一些FrameWork層級的類 ,一旦被頂層的classLoader加載過,那麼它就會緩存到內存裏面,之後任何地方用到,就不用從新加載了
類加載的隔離功能 不一樣繼承路線上的ClassLoader 加載的類不是同一個類,避免開發者本身寫一代碼僞形成系統的類庫來訪問咱們系統可見成員變量。例如:系統層級的類通常初始化的時候就會加載,好比java.lang.String, 應用程序啓動以前就會被系統加載,若是在一個app裏面寫一個自定String 替換掉java.lang.String 會形成嚴重的安全問題。判斷是不是同一個類判斷,除了className packageName 另外還須要是同一個ClassLoader加載的。
ClassLoader 源碼 (加載流程)
ClassLoader loadClass 首先判斷被本身或者雙親加載過,若是未加載過,調用BaseDexClassLoader 的findClass,調用DexPathList findClass ,而且完成將dex文件轉換成DexFile ,轉換成Elements, 遍歷數據,調用DexFile loadClassBinaryName - > native
Android 中動態加載要點?