jvm的發展:
HotSpot VM(sun公司)以前使用最廣泛的 ,邊編譯邊運行,熱點數據/多次運行的會翻譯成二進制保存本地。
JRocket(bea)號稱最快的jvm ,啓動後把字節碼文件編譯成二進制文件,運行,運行速度快,但是啓動慢
J9 VM(IBM)
Oracle 收購這兩家,發佈新版本,目前HotSpot是使用最廣泛的Jvm.
jvm的作用:
內存分配和垃圾回收
jvm 內存模型:
包括: 堆 方法區 虛擬機棧 本地方法棧 程序計數器等
1.堆 大部分new出來的對象/反射 等都是放在該區域。堆中內存進一步分爲 新生代(新生代包括了eden區和 survival(from)/survival(to))和老年代;
eden區域和兩個survival區默認比值爲8:1:1,因爲java中只有小部分對象能夠存活,比例小於2%或10%,
2 方法區,在jdk 1.7以前稱爲永久代,是在堆中分配空間,jdk1.8以後成爲元空間,最大區別就是,元空間大小受限制與內 存 大小。方法區保存 類信息 常量 靜態變量 JIT即時編譯器編譯後的代碼等
這兩部分是線程共享區域
3 程序計數器 ,jvm中唯一不會發生OOM,指向當前線程的指令位置或者class行號。因爲java天生多線程,涉及到線程切 換,爲了確保多線程環境下程序正常執行。
4虛擬機棧 ,有棧的特點,FILO先進後出,存放當前線程的數據/指令/返回地址。默認-Xss1M .
每個方法在使用時候創建棧幀,每個棧幀中包括了
a 局部變量表,存放8大基本數據類型和reference引用
b 操作數棧 對方法的調用,出棧入棧
c 動態鏈接 方法的多態
d 返回地址 方法返回地址
5 本地方法棧 保存的native方法,在調用本地方法時候,不會創建棧幀,在動態鏈接中直接調用。程序計數器也不保存行號
HotSpot把本地方法棧和虛擬機棧合二爲一,其中在jvm中3.4.5三個是線程私有的,隨着線程產生和銷燬。
GC
gc主要針對堆中來講,其中包括了垃圾回收算法
1. 複製算法,使用在新生代中,當eden區內存不夠時候或者空間分配擔保,會發起mirror GC。存活對象進入survival區域,在 from 和 to兩個區域來回複製。速度快,內存空間連續,但是空間利用率低。新生代中的對象90%是朝生夕死,所以只有10%存活下來。
2 標記清除算法 產生空間隨便,速度相對1要低。
3 標記整理算法 速度比2低
垃圾回收器:
單線程 | d多線程 | t特點 | |
新生代 | serial |
par new parallel scavenge |
G1 |
老年代 | serial old |
cms parallel old |
新生代 |
serial |
複製算法 | 單線程 |
par new
parallel scavenge |
複製算法 | 並行多線程收集器 | |
老年代 | serial old | 標記整理 | 單線程 |
cms | 標記清除 | 併發和並行收集器 | |
paralle old | 標記整理 | 並行多線程收集器 | |
G1 跨越新生代和老年代 | 化整爲零 標記整理 | 並行和併發收集器 |
cms垃圾回收器:佔用cpu資源,浮動垃圾/內存碎片
1 初始標記 用戶線程暫停,時間短,主要爲了查找gcRoots
2併發標記 用戶線程和GC線程同時運行,時間長
3重新標記 用戶線程暫停,時間短
4併發清理 用戶線程和gc線程同時運行,時間長
G1 垃圾回收器:空間整合,不會產生垃圾碎片。可預測的停頓
gc模式:yong gc mixed gc
1.初始標記 主要爲了查找gcRoots
2並發表及
3最終標記
4 回收
垃圾回收的對象:
1.引用計數法
2可達性分析 gcRoots
在Java, 可作爲GC Roots的對象包括:
1.方法區中類靜態屬性引用的對象。
2.方法區中常量引用的對象。
3.虛擬機棧(本地變量表)中引用的對象。
本地方法棧JNI(Native方法)中引用的對象