###java虛擬機 jvm
jvm整體結構
##jvm內存空間
java 棧區 它存放的是java方法執行時的所有的數據
棧幀 一個棧幀代表一個方法 每個方法的調用就是一個棧幀在虛擬機棧中入棧和出棧
本地方法棧:專門爲nativie方法服務,也是通過棧幀調用
方法區,存儲被虛擬機加載的類信息,常量,靜態變量等數據。
java堆:所有通過new創建的對象的內存都在堆中分配,是虛擬機中最大的一塊內存,是gc要回收的部分
##gc垃圾回收機制
垃圾收集算法
1,引用計數算法 對象被引用 計數器加1 (老算法,存在A-B相互引用,不會被回收)
2,可達性算法:從gcroot節點。尋找引用節點。沒有引用的節點標記爲垃圾節點,
###4種引用類型
分爲4種,用來控制對象的生命週期
強引用 不會被垃圾回收期回收,會拋出oom異常
軟引用 在內存足夠的情況下 不會去回收 效果和強引用一樣
弱引用 生命週期比軟引用少很多,在gc回收的時候,不管內存是否足夠 都會回收他
虛引用 就是沒有引用,垃圾回收期任何時候都會回收他
refercequene 一般和軟引用,弱引用關聯
如果軟應用被垃圾回收期回收了 就會把這個引用加入到這個隊列當中
垃圾回收算法
1,標記清除算法: 從根節點遍歷,將不可達的引用標記,在gc執行的時候回收掉標記後的引用,缺點是會造成內存碎片
2,複製算法:從根節點遍歷,複製所有可達的引用到一個新的內存,將原來的引用內存清空,不會產生碎片,但是效率比第一種差,(適合內存存活較少的時候)
3,標記整理算法:從根節點遍歷,將不可達的標記,清除後, 更新指針,將引用對象往空閒區移動,避免產生內存碎片
jvm虛擬機觸發垃圾回收的時機
1,java虛擬機無法在爲新的對象分配內存空間的時候
2,手動調用system.gc
3,低優先級的gc線程被啓動
java源代碼編譯過程 java-class的過程如下
##dalvik和jvm的不用
1,加載文件的格式不同一個加載class,一個加載dex
2,jvm只能存在一個,dvm可以存在多個
3,dvm是基於寄存器的,jvm是基於棧的
art
dvm使用jit將字節碼轉換成機器碼 效率低
art採用aot預編譯技術,執行數據更快