(一) 概述:java
全稱:java virtual machine(java 虛擬機) 是一個進程 用來模擬計算單元 將.class文件轉成計算機可以識別的指令算法
注:jvm是 java 語言跨平臺性(一次編譯處處運行)的基礎bootstrap
(二) JVM虛擬機運行的流程:安全
1.讀取字節碼文件所在的路徑多線程
//類加載機制併發
//方法區(元數據區)用來存放類的描述信息app
3.獲取該類的實例(對象)jvm
//堆 用來存儲對象操作系統
4.經過對象名.的方式調用方法線程
//棧 用來存放局部變量及全部代碼執行的
(三) JVM虛擬機的類加載機制
JVM 底層加載類依靠三大組件:
BootStrapClassLoader 啓動類加載器
負責加載 : jre /lib/ rt.jar
ExtClassLoader 擴展類加載器
負責加載: jre/lib/ext/* 文件夾下全部的jar 包
注:這倆個加載器執行完畢後,JVM虛擬機基本上就初始化完畢了
APPClassLoader 應用程序加載器
負責加載用戶自定義的類的
// UserClassLoader //自定義加載器
//自定義加載器就是自定義一個類繼承classloader 而後重寫 findclass(),loadclass()倆個方法便可
加載順序: BootStrap --> ExtClassLoader --> AppClassLoader --> UserClassLoader
(四) JVM虛擬機加載機制(二):檢查順序
加載順序:
BootStrap-->ext-->app
檢查順序:
app-->ext-->BootStrap
app檢查A.class是否加載: 是: 不加載A.class 否: 加載A.class
ext檢查A.class是否加載: 是: 不加載A.class 否: 加載A.class
bootstrap先加載 A.class
對如: UserClassLoader APPClassLoader ExtClassLoader BootStrapClassLoader 總結: 自上而下檢查, 自下而上運行.
(五) JVM的內存模型
1 ) A.class字節碼文件被加載到內存
//存儲在方法區中,而且方法區中包含常量池
2)建立本類的實例對象,存儲在堆中(heap)
3)經過對象名.的形式調用方法,方法的執行過程是在:虛擬機棧中完成的
//一個線程對應一個虛擬機棧,每個方法對應一個:虛擬機棧中的棧幀
4)程序計數器區域記錄的是當前程序的執行位置 ,例如
線程1:print(),第三行
5)將具體要執行的代碼交給:執行引擎來執行
6)執行引擎調用:本地庫接口 本地方法庫來執行具體的內容
本地方法棧:就是本地方法的執行的區域(底層C語言,外部庫運行的空間)</p> </li> <li> <p>直接內存 :當JVM內存不夠用的時候,會找操做系統借點內存
(六) 線程安全和內存溢出的問題
存在線程安全問題的模塊
堆:會 // 多線程 ,併發 .操做同一數據 棧 :不會 //線程棧之間是相互獨立的
方法區:不會 //存儲常量,類的描述信息
程序計數器 :不會 //記錄程序的執行流程
存在內存溢出問題的模塊
堆:會 //不斷建立對象,內存被撐爆
棧:會 //不斷調用方法 內存被撐爆
方法區 :會 常量過多 .class文件過大
程序計數器 :會//理論上講會 由於線程過多,致使計數器過多
(七) JDK1.7的堆內存的垃圾回收算法
jdk 1.7將堆內存劃分爲三部分 年輕代 ,年老代,持久代 (就是方法區)
年輕代又分爲三個區域:使用的是複製算法
Eden:伊甸園
//存儲的新生對象,當伊甸園滿的時候,會將存活對象複製到S1區,並將移除那些垃圾對象
survivor: 倖存者區1
//當該區域滿的時候,會將存活的對象複製到S2區 並將移除那些垃圾對象
survivor:倖存者區2
//當該區域滿的時候 會將存活對象複製到S1區 並移除到那些垃圾對象
注:S1區和S2區是來回互相賦值的
年老代: 使用的是標記清除算法,標記整理算法
當對象在S1區和S2區之間來回複製15次 纔會加載到 年老代
當年輕代和年老代都所有裝滿的時候就會報堆內存溢出
持久代 :就是方法區 存儲常量,類的描述信息
JDK 1.7 默認垃圾回收器
serial 收集器 :單線程收集器,它使用一個cpu或者一個線程來回收對象 它在垃圾收集的時候必須暫停其它工做線程,直到垃圾回收完畢
Parnew 收集器 :多線程收集器
Paraller scavenge 收集器 是一個新生代的收集器 而且使用複製算法 並且是一個並行的多線程收集器 其它收集器是儘可能縮短垃圾收集時用戶線程的停頓時間 而parallel scavenge收集器的目標是達到一個可控制的吞吐量
CMS收集器 :主要針對於年老代 精細化運營 前邊的垃圾收集器都是一刀切(在回收垃圾的時候其它線程都是等待) 而cms是儘量下降等待時間 並行執行程序,提升運行效率
(八) jdk 1.8 之後的垃圾回收器 G1垃圾回收器 在jdk 1.9的時候成了默認的垃圾回收器
G1垃圾回收器
1)將內存劃分爲一樣大小的region區域
2)每一個region既能夠是年輕代也能夠是年老代,還能夠是倖存者區
3)程序運行前期,建立大量對象的時候能夠將每一個region看作是Eden (伊甸園)
4)程序運行中期 能夠將Eden的region變成survivor
5)程序運行後期 能夠縮短Eden Survivor 的區域變成old區域
6)H:存儲大對象
注:方法區從JVM模型中遷移出去了徹底使用系統的內存 方法區也更名叫元數據區