java文件經過編譯器編譯成class字節碼,由JVM加載並解釋執行。java虛擬機是實現了java跨平臺的核心技術,同時爲了解決解釋執行速度慢的問題,提供了JIT把常常執行的代碼編譯成機器指令。java
0.1裝載 字節碼加載到內存中,建立Class對象 0.2連接 驗證字節碼合法性、靜態變量分配內存空間、設置初始值,字符引用轉換成直接引用 0.3初始化 靜態變量和靜態代碼塊進行賦值。算法
1.1 程序計數器 線程私有的,存儲當前指令的內存地址。多線程
1.2 堆 存放實例對象,能夠經過-Xmx -Xms來修改堆的最大和最小值。當擴展時空間不夠則會拋出OOM異常。 堆又分爲新生代、老年代。 新生代又分爲Eden區,Survior1區,Survior2區。由於新生代對象死亡比較快,因此使用複製算法 由於老年代對象死亡時間較長,因此標記整理算法。jvm
1.3 虛擬機棧 線程私有的,當進入一個方法的時候會建立棧幀。棧幀存放局部變量(基本類型、引用)、方法出口等信息。 線程請求棧深度超過了容許的最大深度會拋出StackOverflowError異常。當擴展時空間不夠則會拋出OOM異常。spa
1.4 本地方法棧 跟虛擬機棧同樣,用於native方法。線程
1.5 方法區 類信息、常量、靜態變量對象
引用計數法 對象保存一個被引用次數,若是被引用次數爲0,則該對象能夠被回收。也存一下一些問題,若是兩個對象相互引用的狀況下,沒法實現內存
可達性分析 經過一系列的GC Root對象來遍歷,若是一個對象和全部的GC Root都沒有鏈路話,則此被回收。編譯器
當Eden區空間不夠的時候,會進行一次MinorGC,把Eden區和Survior區的存活對象複製到另外一個Survior區,並將這些對象的年齡+1,若是對象年齡達到了16則將對象移動到老年代。對於大對象在建立的時候直接放到老年代。若是老年代空間不夠了,則會進行一次FullGC。虛擬機
新生代:Serial(單線程),ParNew(多線程),Parallel Scavenge(多線程、注重吞吐量), 老年代:Serial Old(單線程),CMS(多線程,注重最短停頓時間,標記清除算法),Parallel Old
G1:多線程,能夠設置最大暫停時間。 將堆分爲近2000個region,各region之間使用複製算法。總體收集時使用標記整理算法。因此不會產生內存碎片。 根據設置的最大停頓時間,預測各個region區停頓時間,作出符合最大停頓時間的回收計劃。
hotspot是jvm的實現之一,是sunJDK和 openJDK中所帶的虛擬機,其中方法區的實現就是永久帶,不過在jdk8中,把永久帶改爲了metaspace,使用本地內存,解決永久帶內存溢出的問題。