java進階五(jvm)
一、JVM
1、定義
(1)、概念
是運行在你係統上的另一個進程,也需要內存來完成它的運 行時操作。
JVM本身是硬件的一層軟件抽象,在這之上才能夠運行Java程序,也纔有了我們所說的平臺獨立性以及WORA(一次編寫,處處運 行)
(2)、種類
Oralce-Sun Hotspot
Oralce JRockit
IBM J9
Taobao JVM(淘寶)
注: 正常使用oracle的jdk,所以就是 Hotspot Jvm, 以下內容 只講 Hotspot Jvm
(3)、組成(一種說法)
堆
方法區(非堆)
JVM棧
本地棧
PC寄存器
2、堆 ---> jvm參數:-Xms和-Xmx
(1)、作用
a、堆是實例化的對象所存儲地方
b、由所有線程共享
c、當堆耗盡的時候,JVM會拋出java.lang.OutOfMemoryError 異常
(2)、組成
a、Eden區 ---> jvm參數:-XX:NewSize和-XX:MaxNewSize
主要是用來存放新生的對象,由新生代GC(垃圾回收器)進行清理
b、兩個Survivor區 ---> jvm參數:-XX:SurvivorRatio
歷經了Eden區的垃圾回收仍能存活下來的依舊存在引用的對象
c、老年代(old)
歷經了Eden區和Survivor區的多次GC後仍然存活下來的對象( 一直存在引用),由老年代GC(major GC)進行清理
3、方法區(又稱 非堆區域)
(1)、作用
a、用於存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯後的代碼等信息
b、由所有線程共享
(2)、組成
a、持久代(permgen) ---> jvm參數:-XX:PermSize及 -XX:MaxPermSize
存儲包括類定義,結構,字段,方法(數據及代碼)以及常量在內的類相關數據。
注: 在很多虛擬機相關文檔中,也將其稱之爲"永久域"(permanent heap),作爲堆空間的一部分存在。(個人定位: 此說法不夠精準)
JDK8 HotSpot JVM 移除永久域,使用本地內存來存儲類元數據信息並稱之爲:元空間(Metaspace),由參數 -XX:MetaspaceSize和-XX:MaxMetaspaceSize 指定,如無指定則動態調整。
b、代碼緩存(code cache)
用來存儲編譯後的代碼,編譯後的代碼就是本地代碼(硬件相關的),它是由JIT(Just In Time)編譯器生成的。
注: 永久域其實是一個獨立域並且不認爲是堆的一部分。
4、JVM棧 ---> jvm參數:-Xss
(1)、作用
a、和Java類中的方法密切相關
b、存儲局部變量以及方法調用的中間結果及返回值
c、Java中的每個線程都有自己專屬的棧,這個棧是別的線程無法訪問的。
5、本地棧
(1)、作用
a、用於本地方法(非Java代碼)
b、按線程分配
6、PC寄存器
(1)、作用
a、特定線程的程序計數器
b、包含JVM正在執行的指令的地址(如果是本地方法的話它的值則未定義)
二、Jvm垃圾收集器
1、基礎概念
(1)、串行 (Sequential)
指兩個或者多個事件順序執行
(2)、併發 (Concurrent)
指兩個或多個事件在同一時間間隔內發生
a、在操作系統中
指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。
①程序與計算不再一一對應,一個程序副本可以有多個計算
②併發程序之間有相互制約關係,直接制約體現爲一個程序需要另一個程序的計算結果,間接制約體現爲多個程序競爭某一資源,如處理機、緩衝區等。
③併發程序在執行中是走走停停,斷續推進的。
b、在網絡服務器上
併發是指同一時刻能處理的連接數
(3)、並行 (parallel)
指兩個或者多個事件在同一時刻發生
(4)、分佈式(distributed)
分佈式在並行處理的基礎上,強調任務正在執行的物理設備,如處理器、內存等等硬件,在物理上是分開的。
(5)、區別
併發和並行從宏觀上來講都是同時處理多路請求的概念,更加強調多個任務同時在運行。
併發>並行>分佈式
併發在單核和多核都可存在,就是同一時間有多個可以執行的進程
並行是指同一時間多個進程在微觀上都在真正的執行,這就只有在多核的情況下了。
2、分類
(1)、串行
處理小型數據,jdk1.4之前默認使用
(2)、併發
(3)、並行
1.5和1.5之後使用
三、JVM主要參數的作用
1、堆設置
-Xms ---> 設置jvm內存的初始大小 ---> -Xms512m (代表jvm最少用 512m內存)
-Xmx ---> 設置jvm內存(初始堆)的最大值 ---> 一般爲服務器的3/4內存量,不應該超過物理內存的90%。
-Xmn ---> 設置年輕代的大小(只針對 jdk1.4,後被廢棄) ---> Sun官方推薦配置爲整個堆的3/8。
-Xss ---> 設置每個線程的堆棧大小 ---> 在相同物理內存下,減小這個值能生成更多的線程(默認512k)
-XX:NewSize ---> 設置年輕代的初始值
-XX:MaxNewSize ---> 設置年輕代的最大值
-XX:PermSize ---> 設置永久域的初始值
-XX:MaxPermSize ---> 設置永久域的最大值
-XX:NewRatio ---> 設置年輕代與老年代之比 ---> -XX:NewRatio = 4就表示年輕代與老年代之比爲1:4
-XX:SurvivorRatio ---> 設置年輕代中Eden區與兩個Survivor區的比值。
2、收集器設置
-XX:+UseSerialGC ---> 設置串行收集器
-XX:+UseParallelGC ---> 設置並行收集器(僅對年輕代有效)
-XX:+UseParallelOldGC ---> 設置並行老年代收集器(JDK6.0起支持)
-XX:+UseConcMarkSweepGC ---> 設置併發收集器
3、垃圾回收統計信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
4、併發收集器設置
-XX:+CMSIncrementalMode ---> 設置爲增量模式。適用於單CPU情況。
-XX:+UseCMSCompactAtFullCollection ---> 設置運行多少次GC以後對內存空間進行壓縮、整理。
注: 併發收集器不對內存空間進行壓縮、整理,所以運行一段時間以後會產生“碎片”,使得運行效率降低。
-XX:+UseCMSCompactAtFullCollection ---> 打開對老年代的壓縮。可能會影響性能,但是可以消除碎片
-XX:ParallelGCThreads ---> 設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數
5、並行收集器設置
-XX:ParallelGCThreads ---> 設置並行收集器收集時使用的CPU數。並行收集線程數。
-XX:MaxGCPauseMillis ---> 設置並行收集最大暫停時間
-XX:GCTimeRatio ---> 設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)
6、jboss配置示例
(1)、生產環境8G內存
if [ "x$JAVA_OPTS" = "x" ]; then
JAVA_OPTS="-Xss128k -Xms6000m -Xmx6000m -XX:MaxNewSize=512m -XX:MaxPermSize=512M -XX:+UseParallelGC -XX:ParallelGCThreads=16
-XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
fi
(2)、生產環境4G內存
if [ "x$JAVA_OPTS" = "x" ]; then
JAVA_OPTS="-Xss128k -Xms3000m -Xmx3000m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC -XX:ParallelGCThreads=16
-XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
fi
三、JVM常見錯誤
1、java.lang.OutOfMemoryError
(1)、原因
這個主要就是JVM參數沒有配好引起的
(2)、錯誤類型
a、java.lang.OutOfMemoryError: Java heap space
是有關堆內存的內存溢出,可以同過配置-Xms和-Xmx參數來設置。
b、java.lang.OutOfMemoryError: PermGen space
是有關永久域的內存溢出,可以通過配置-XX:MaxPermSize來設置。
2、示例
JAVA_OPTS="-Xms256m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=128m -XX:MaxPermSize=256m
-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -Djboss.platform.mbeanserver"
1、定義
(1)、概念
是運行在你係統上的另一個進程,也需要內存來完成它的運 行時操作。
JVM本身是硬件的一層軟件抽象,在這之上才能夠運行Java程序,也纔有了我們所說的平臺獨立性以及WORA(一次編寫,處處運 行)
(2)、種類
Oralce-Sun Hotspot
Oralce JRockit
IBM J9
Taobao JVM(淘寶)
注: 正常使用oracle的jdk,所以就是 Hotspot Jvm, 以下內容 只講 Hotspot Jvm
(3)、組成(一種說法)
堆
方法區(非堆)
JVM棧
本地棧
PC寄存器
2、堆 ---> jvm參數:-Xms和-Xmx
(1)、作用
a、堆是實例化的對象所存儲地方
b、由所有線程共享
c、當堆耗盡的時候,JVM會拋出java.lang.OutOfMemoryError 異常
(2)、組成
a、Eden區 ---> jvm參數:-XX:NewSize和-XX:MaxNewSize
主要是用來存放新生的對象,由新生代GC(垃圾回收器)進行清理
b、兩個Survivor區 ---> jvm參數:-XX:SurvivorRatio
歷經了Eden區的垃圾回收仍能存活下來的依舊存在引用的對象
c、老年代(old)
歷經了Eden區和Survivor區的多次GC後仍然存活下來的對象( 一直存在引用),由老年代GC(major GC)進行清理
3、方法區(又稱 非堆區域)
(1)、作用
a、用於存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯後的代碼等信息
b、由所有線程共享
(2)、組成
a、持久代(permgen) ---> jvm參數:-XX:PermSize及 -XX:MaxPermSize
存儲包括類定義,結構,字段,方法(數據及代碼)以及常量在內的類相關數據。
注: 在很多虛擬機相關文檔中,也將其稱之爲"永久域"(permanent heap),作爲堆空間的一部分存在。(個人定位: 此說法不夠精準)
JDK8 HotSpot JVM 移除永久域,使用本地內存來存儲類元數據信息並稱之爲:元空間(Metaspace),由參數 -XX:MetaspaceSize和-XX:MaxMetaspaceSize 指定,如無指定則動態調整。
b、代碼緩存(code cache)
用來存儲編譯後的代碼,編譯後的代碼就是本地代碼(硬件相關的),它是由JIT(Just In Time)編譯器生成的。
注: 永久域其實是一個獨立域並且不認爲是堆的一部分。
4、JVM棧 ---> jvm參數:-Xss
(1)、作用
a、和Java類中的方法密切相關
b、存儲局部變量以及方法調用的中間結果及返回值
c、Java中的每個線程都有自己專屬的棧,這個棧是別的線程無法訪問的。
5、本地棧
(1)、作用
a、用於本地方法(非Java代碼)
b、按線程分配
6、PC寄存器
(1)、作用
a、特定線程的程序計數器
b、包含JVM正在執行的指令的地址(如果是本地方法的話它的值則未定義)
二、Jvm垃圾收集器
1、基礎概念
(1)、串行 (Sequential)
指兩個或者多個事件順序執行
(2)、併發 (Concurrent)
指兩個或多個事件在同一時間間隔內發生
a、在操作系統中
指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。
①程序與計算不再一一對應,一個程序副本可以有多個計算
②併發程序之間有相互制約關係,直接制約體現爲一個程序需要另一個程序的計算結果,間接制約體現爲多個程序競爭某一資源,如處理機、緩衝區等。
③併發程序在執行中是走走停停,斷續推進的。
b、在網絡服務器上
併發是指同一時刻能處理的連接數
(3)、並行 (parallel)
指兩個或者多個事件在同一時刻發生
(4)、分佈式(distributed)
分佈式在並行處理的基礎上,強調任務正在執行的物理設備,如處理器、內存等等硬件,在物理上是分開的。
(5)、區別
併發和並行從宏觀上來講都是同時處理多路請求的概念,更加強調多個任務同時在運行。
併發>並行>分佈式
併發在單核和多核都可存在,就是同一時間有多個可以執行的進程
並行是指同一時間多個進程在微觀上都在真正的執行,這就只有在多核的情況下了。
2、分類
(1)、串行
處理小型數據,jdk1.4之前默認使用
(2)、併發
(3)、並行
1.5和1.5之後使用
三、JVM主要參數的作用
1、堆設置
-Xms ---> 設置jvm內存的初始大小 ---> -Xms512m (代表jvm最少用 512m內存)
-Xmx ---> 設置jvm內存(初始堆)的最大值 ---> 一般爲服務器的3/4內存量,不應該超過物理內存的90%。
-Xmn ---> 設置年輕代的大小(只針對 jdk1.4,後被廢棄) ---> Sun官方推薦配置爲整個堆的3/8。
-Xss ---> 設置每個線程的堆棧大小 ---> 在相同物理內存下,減小這個值能生成更多的線程(默認512k)
-XX:NewSize ---> 設置年輕代的初始值
-XX:MaxNewSize ---> 設置年輕代的最大值
-XX:PermSize ---> 設置永久域的初始值
-XX:MaxPermSize ---> 設置永久域的最大值
-XX:NewRatio ---> 設置年輕代與老年代之比 ---> -XX:NewRatio = 4就表示年輕代與老年代之比爲1:4
-XX:SurvivorRatio ---> 設置年輕代中Eden區與兩個Survivor區的比值。
2、收集器設置
-XX:+UseSerialGC ---> 設置串行收集器
-XX:+UseParallelGC ---> 設置並行收集器(僅對年輕代有效)
-XX:+UseParallelOldGC ---> 設置並行老年代收集器(JDK6.0起支持)
-XX:+UseConcMarkSweepGC ---> 設置併發收集器
3、垃圾回收統計信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
4、併發收集器設置
-XX:+CMSIncrementalMode ---> 設置爲增量模式。適用於單CPU情況。
-XX:+UseCMSCompactAtFullCollection ---> 設置運行多少次GC以後對內存空間進行壓縮、整理。
注: 併發收集器不對內存空間進行壓縮、整理,所以運行一段時間以後會產生“碎片”,使得運行效率降低。
-XX:+UseCMSCompactAtFullCollection ---> 打開對老年代的壓縮。可能會影響性能,但是可以消除碎片
-XX:ParallelGCThreads ---> 設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數
5、並行收集器設置
-XX:ParallelGCThreads ---> 設置並行收集器收集時使用的CPU數。並行收集線程數。
-XX:MaxGCPauseMillis ---> 設置並行收集最大暫停時間
-XX:GCTimeRatio ---> 設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)
6、jboss配置示例
(1)、生產環境8G內存
if [ "x$JAVA_OPTS" = "x" ]; then
JAVA_OPTS="-Xss128k -Xms6000m -Xmx6000m -XX:MaxNewSize=512m -XX:MaxPermSize=512M -XX:+UseParallelGC -XX:ParallelGCThreads=16
-XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
fi
(2)、生產環境4G內存
if [ "x$JAVA_OPTS" = "x" ]; then
JAVA_OPTS="-Xss128k -Xms3000m -Xmx3000m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC -XX:ParallelGCThreads=16
-XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
fi
三、JVM常見錯誤
1、java.lang.OutOfMemoryError
(1)、原因
這個主要就是JVM參數沒有配好引起的
(2)、錯誤類型
a、java.lang.OutOfMemoryError: Java heap space
是有關堆內存的內存溢出,可以同過配置-Xms和-Xmx參數來設置。
b、java.lang.OutOfMemoryError: PermGen space
是有關永久域的內存溢出,可以通過配置-XX:MaxPermSize來設置。
2、示例
JAVA_OPTS="-Xms256m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=128m -XX:MaxPermSize=256m
-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -Djboss.platform.mbeanserver"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.