JVM的性能優化(上)

(一) 概述:java

全稱:java virtual machine(java 虛擬機) 是一個進程 用來模擬計算單元 將.class文件轉成計算機可以識別的指令算法

注:jvm是 java 語言跨平臺性(一次編譯處處運行)的基礎bootstrap

(二) JVM虛擬機運行的流程:安全

1.讀取字節碼文件所在的路徑多線程

//類加載機制併發

  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模型中遷移出去了徹底使用系統的內存 方法區也更名叫元數據區

相關文章
相關標籤/搜索