文本說明成果jvm2019v1_第1頁
文本說明成果jvm2019v1_第2頁
文本說明成果jvm2019v1_第3頁
文本說明成果jvm2019v1_第4頁
文本說明成果jvm2019v1_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、快速入門JVM講師:夏磊快速入門JVM請(qǐng)談?wù)勀銓?duì)JVM的理解?java8的虛擬機(jī)有什么更新?什么是OOM?什么是StackOverflowError?有哪些方法分析?JVM的常用參數(shù)調(diào)優(yōu)你知道哪些?內(nèi)存快照抓取和MAT分析DUMP文件知道嗎?談?wù)凧VM中,對(duì)類加載器你的認(rèn)識(shí)?JVM體系結(jié)構(gòu)概述堆體系結(jié)構(gòu)概述堆參數(shù)調(diào)優(yōu)入門總 結(jié)Contents目錄JVM體系結(jié)構(gòu)概述PART1JVM體系結(jié)構(gòu)概述JVM位置JVM是運(yùn)行在操作系統(tǒng)之上的,它與硬件沒有直接的交互JVM體系結(jié)構(gòu)概述JVM體系結(jié)構(gòu)概述類裝載器ClassLoader負(fù)責(zé)加載class文件,class文件在文件開頭有特定的文件標(biāo)示,并且Clas

2、sLoader只負(fù)責(zé)class文件的加載,至于它是否可以運(yùn)行,則由Execution Engine決定 echo %JAVA_HOME%echo %PATH%echo %CLASSPATH%JVM體系結(jié)構(gòu)概述類裝載器ClassLoader2虛擬機(jī)自帶的加載器啟動(dòng)類加載器(Bootstrap)C+擴(kuò)展類加載器(Extension)Java應(yīng)用程序類加載器 (AppClassLoader)Java 也叫系統(tǒng)類加載器,加載當(dāng)前應(yīng)用的classpath的所有類用戶自定義加載器 Java.lang.ClassLoader的子類,用戶可以定制類的加載方式JVM體系結(jié)構(gòu)概述類裝載器ClassLoader3C

3、ode案例sun.misc.Launcher它是一個(gè)java虛擬機(jī)的入口應(yīng)用JVM體系結(jié)構(gòu)概述Execution Engine執(zhí)行引擎負(fù)責(zé)解釋命令,提交操作系統(tǒng)執(zhí)行。 JVM體系結(jié)構(gòu)概述Native Interface本地接口本地接口的作用是融合不同的編程語言為 Java 所用,它的初衷是融合 C/C+程序,Java 誕生的時(shí)候是 C/C+橫行的時(shí)候,要想立足,必須有調(diào)用 C/C+程序,于是就在內(nèi)存中專門開辟了一塊區(qū)域處理標(biāo)記為native的代碼,它的具體做法是 Native Method Stack中登記 native方法,在Execution Engine 執(zhí)行時(shí)加載native libr

4、aies。目前該方法使用的越來越少了,除非是與硬件有關(guān)的應(yīng)用,比如通過Java程序驅(qū)動(dòng)打印機(jī)或者Java系統(tǒng)管理生產(chǎn)設(shè)備,在企業(yè)級(jí)應(yīng)用中已經(jīng)比較少見。因?yàn)楝F(xiàn)在的異構(gòu)領(lǐng)域間的通信很發(fā)達(dá),比如可以使用 Socket通信,也可以使用Web Service等等,不多做介紹。它的具體做法是Native Method Stack中登記native方法,在Execution Engine 執(zhí)行時(shí)加載本地方法庫。Native Method StackJVM體系結(jié)構(gòu)概述PC寄存器每個(gè)線程都有一個(gè)程序計(jì)數(shù)器,是線程私有的,就是一個(gè)指針,指向方法區(qū)中的方法字節(jié)碼(用來存儲(chǔ)指向下一條指令的地址,也即將要執(zhí)行的指令代碼

5、),由執(zhí)行引擎讀取下一條指令,是一個(gè)非常小的內(nèi)存空間,幾乎可以忽略不記。JVM體系結(jié)構(gòu)概述方法區(qū)是被所有線程共享,所有字段和方法字節(jié)碼,以及一些特殊方法如構(gòu)造函數(shù),接口代碼也在此定義。簡單說,所有定義的方法的信息都保存在該區(qū)域,此區(qū)屬于共享區(qū)間。 靜態(tài)變量+常量+類信息(構(gòu)造方法/接口定義)+運(yùn)行時(shí)常量池存在方法區(qū)中But實(shí)例變量存在堆內(nèi)存中,和方法區(qū)無關(guān)Method Area 方法區(qū)JVM體系結(jié)構(gòu)概述Stack 棧Stack 棧是什么棧也叫棧內(nèi)存,主管Java程序的運(yùn)行,是在線程創(chuàng)建時(shí)創(chuàng)建,它的生命期是跟隨線程的生命期,線程結(jié)束棧內(nèi)存也就釋放,對(duì)于棧來說不存在垃圾回收問題,只要線程一結(jié)束該棧

6、就Over,生命周期和線程一致,是線程私有的。8種基本類型的變量+對(duì)象的引用變量+實(shí)例方法都是在函數(shù)的棧內(nèi)存中分配。棧存儲(chǔ)什么?棧幀中主要保存3 類數(shù)據(jù):本地變量(Local Variables):輸入?yún)?shù)和輸出參數(shù)以及方法內(nèi)的變量;棧操作(Operand Stack):記錄出棧、入棧的操作;棧幀數(shù)據(jù)(Frame Data):包括類文件、方法等等。JVM體系結(jié)構(gòu)概述Stack 棧棧運(yùn)行原理:棧中的數(shù)據(jù)都是以棧幀(Stack Frame)的格式存在,棧幀是一個(gè)內(nèi)存區(qū)塊,是一個(gè)數(shù)據(jù)集,是一個(gè)有關(guān)方法(Method)和運(yùn)行期數(shù)據(jù)的數(shù)據(jù)集,當(dāng)一個(gè)方法A被調(diào)用時(shí)就產(chǎn)生了一個(gè)棧幀 F1,并被壓入到棧中,A

7、方法又調(diào)用了 B方法,于是產(chǎn)生棧幀 F2 也被壓入棧,B方法又調(diào)用了 C方法,于是產(chǎn)生棧幀 F3 也被壓入棧,執(zhí)行完畢后,先彈出F3棧幀,再彈出F2棧幀,再彈出F1棧幀遵循“先進(jìn)后出”/“后進(jìn)先出”原則。JVM體系結(jié)構(gòu)概述Stack 棧圖示在一個(gè)棧中有兩個(gè)棧幀:棧幀 2是最先被調(diào)用的方法,先入棧,然后方法 2 又調(diào)用了方法1,棧幀 1處于棧頂?shù)奈恢?,棧?2 處于棧底,執(zhí)行完畢后,依次彈出棧幀 1和棧幀 2,線程結(jié)束,棧釋放。 每執(zhí)行一個(gè)方法都會(huì)產(chǎn)生一個(gè)棧幀,保存到棧(后進(jìn)先出)的頂部,頂部棧就是當(dāng)前的方法,該方法執(zhí)行完畢 后會(huì)自動(dòng)將此棧幀出棧。JVM體系結(jié)構(gòu)概述Stack 棧Exceptio

8、n in thread main java.lang.StackOverflowError棧頂棧幀棧幀JVM體系結(jié)構(gòu)概述棧+堆+方法區(qū)的交互關(guān)系HotSpot是使用指針的方式來訪問對(duì)象:Java堆中會(huì)存放訪問類元數(shù)據(jù)的地址,reference存儲(chǔ)的就直接是對(duì)象的地址JVM體系結(jié)構(gòu)概述三種JVMSun公司的HotSpotBEA公司的JRockitIBM公司的J9 VM堆體系結(jié)構(gòu)概述PART2堆體系結(jié)構(gòu)概述 Heap 堆一個(gè)JVM實(shí)例只存在一個(gè)堆內(nèi)存,堆內(nèi)存的大小是可以調(diào)節(jié)的。類加載器讀取了類文件后,需要把類、方法、常變量放到堆內(nèi)存中,保存所有引用類型的真實(shí)信息,以方便執(zhí)行器執(zhí)行,堆內(nèi)存分為三部分

9、: Permanent Space 永久區(qū) Perm Young Generation Space 新生區(qū) Young/New Tenure generation space 養(yǎng)老區(qū) Old/ Tenure堆體系結(jié)構(gòu)概述Heap堆(Java7之前)一個(gè)JVM實(shí)例只存在一個(gè)堆內(nèi)存,堆內(nèi)存的大小是可以調(diào)節(jié)的。類加載器讀取了類文件后,需要把類、方法、常變量放到堆內(nèi)存中,保存所有引用類型的真實(shí)信息,以方便執(zhí)行器執(zhí)行。堆內(nèi)存邏輯上分為三部分:新生+養(yǎng)老+永久堆體系結(jié)構(gòu)概述新生區(qū)新生區(qū)是類的誕生、成長、消亡的區(qū)域,一個(gè)類在這里產(chǎn)生,應(yīng)用,最后被垃圾回收器收集,結(jié)束生命。新生區(qū)又分為兩部分: 伊甸區(qū)(Ede

10、n space)和幸存者區(qū)(Survivor pace) ,所有的類都是在伊甸區(qū)被new出來的。幸存區(qū)有兩個(gè): 0區(qū)(Survivor 0 space)和1區(qū)(Survivor 1 space)。當(dāng)伊甸園的空間用完時(shí),程序又需要?jiǎng)?chuàng)建對(duì)象,JVM的垃圾回收器將對(duì)伊甸園區(qū)進(jìn)行垃圾回收(Minor GC),將伊甸園區(qū)中的不再被其他對(duì)象所引用的對(duì)象進(jìn)行銷毀。然后將伊甸園中的剩余對(duì)象移動(dòng)到幸存 0區(qū)。若幸存 0區(qū)也滿了,再對(duì)該區(qū)進(jìn)行垃圾回收,然后移動(dòng)到 1 區(qū)。那如果1 區(qū)也滿了呢?再次垃圾回收,滿足條件后再移動(dòng)到養(yǎng)老區(qū)。若養(yǎng)老區(qū)也滿了,那么這個(gè)時(shí)候?qū)a(chǎn)生MajorGC(FullGC),進(jìn)行養(yǎng)老區(qū)的內(nèi)存

11、清理。若養(yǎng)老區(qū)執(zhí)行了Full GC之后發(fā)現(xiàn)依然無法進(jìn)行對(duì)象的保存,就會(huì)產(chǎn)生OOM異?!癘utOfMemoryError”。如果出現(xiàn)java.lang.OutOfMemoryError: Java heap space異常,說明Java虛擬機(jī)的堆內(nèi)存不夠。原因有二:(1)Java虛擬機(jī)的堆內(nèi)存設(shè)置不夠,可以通過參數(shù)-Xms、-Xmx來調(diào)整。(2)代碼中創(chuàng)建了大量大對(duì)象,并且長時(shí)間不能被垃圾收集器收集(存在被引用)。堆體系結(jié)構(gòu)概述堆體系結(jié)構(gòu)概述堆體系結(jié)構(gòu)概述堆體系結(jié)構(gòu)概述永久區(qū)永久存儲(chǔ)區(qū)是一個(gè)常駐內(nèi)存區(qū)域,用于存放JDK自身所攜帶的 Class,Interface 的元數(shù)據(jù),也就是說它存儲(chǔ)的是運(yùn)行

12、環(huán)境必須的類信息,被裝載進(jìn)此區(qū)域的數(shù)據(jù)是不會(huì)被垃圾回收器回收掉的,關(guān)閉 JVM 才會(huì)釋放此區(qū)域所占用的內(nèi)存。如果出現(xiàn)java.lang.OutOfMemoryError: PermGen space,說明是Java虛擬機(jī)對(duì)永久代Perm內(nèi)存設(shè)置不夠。一般出現(xiàn)這種情況,都是程序啟動(dòng)需要加載大量的第三方j(luò)ar包。例如:在一個(gè)Tomcat下部署了太多的應(yīng)用。或者大量動(dòng)態(tài)反射生成的類不斷被加載,最終導(dǎo)致Perm區(qū)被占滿。 Jdk1.6及之前: 有永久代, 常量池1.6在方法區(qū)Jdk1.7: 有永久代,但已經(jīng)逐步“去永久代”,常量池1.7在堆Jdk1.8及之后: 無永久代,常量池1.8在元空間熟悉三區(qū)結(jié)

13、構(gòu)后方可學(xué)習(xí)-JVM垃圾收集堆體系結(jié)構(gòu)概述實(shí)際而言,方法區(qū)(Method Area)和堆一樣,是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)虛擬機(jī)加載的:類信息+普通常量+靜態(tài)常量+編譯器編譯后的代碼等等,雖然JVM規(guī)范將方法區(qū)描述為堆的一個(gè)邏輯部分,但它卻還有一個(gè)別名叫做Non-Heap(非堆),目的就是要和堆分開。對(duì)于HotSpot虛擬機(jī),很多開發(fā)者習(xí)慣將方法區(qū)稱之為“永久代(Parmanent Gen)” ,但嚴(yán)格本質(zhì)上說兩者不同,或者說使用永久代來實(shí)現(xiàn)方法區(qū)而已,永久代是方法區(qū)(相當(dāng)于是一個(gè)接口interface)的一個(gè)實(shí)現(xiàn),jdk1.7的版本中,已經(jīng)將原本放在永久代的字符串常量池移走。常量池(

14、Constant Pool)是方法區(qū)的一部分,Class文件除了有類的版本、字段、方法、接口等描述信息外,還有一項(xiàng)信息就是常量池,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。堆參數(shù)調(diào)優(yōu)入門堆參數(shù)調(diào)優(yōu)入門PART3堆參數(shù)調(diào)優(yōu)入門JVM垃圾收集(Java Garbage Collection )上集,本次均以JDK1.8+HotSpot為例堆參數(shù)調(diào)優(yōu)入門Java7堆參數(shù)調(diào)優(yōu)入門Java8 JDK 1.8之后將最初的永久代取消了,由元空間取代。堆參數(shù)調(diào)優(yōu)入門(堆內(nèi)存調(diào)優(yōu)簡介01)public static void main(String args)long maxMemory = Run

15、time.getRuntime().maxMemory() ;/返回 Java 虛擬機(jī)試圖使用的最大內(nèi)存量。long totalMemory = Runtime.getRuntime().totalMemory() ;/返回 Java 虛擬機(jī)中的內(nèi)存總量。System.out.println(MAX_MEMORY = + maxMemory + (字節(jié))、 + (maxMemory / (double)1024 / 1024) + MB);System.out.println(TOTAL_MEMORY = + totalMemory + (字節(jié))、 + (totalMemory / (doub

16、le)1024 / 1024) + MB);堆參數(shù)調(diào)優(yōu)入門(堆內(nèi)存調(diào)優(yōu)簡介02)發(fā)現(xiàn)默認(rèn)的情況下分配的內(nèi)存是總內(nèi)存的“1 / 4”、而初始化的內(nèi)存為“1 / 64”VM參數(shù):-Xms1024m -Xmx1024m -XX:+PrintGCDetails堆參數(shù)調(diào)優(yōu)入門(堆內(nèi)存調(diào)優(yōu)簡介03)此圖為java7,演示為8堆參數(shù)調(diào)優(yōu)入門(堆內(nèi)存調(diào)優(yōu)簡介04)String str = ;while(true) str += str + new Random().nextInt(88888888) + new Random().nextInt(999999999) ;VM參數(shù):-Xms8m -Xmx8m -XX:+PrintGCDetails堆參數(shù)調(diào)優(yōu)入門堆參數(shù)調(diào)優(yōu)入門官

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論