文本說明成果jvm2019v1_第1頁
文本說明成果jvm2019v1_第2頁
文本說明成果jvm2019v1_第3頁
文本說明成果jvm2019v1_第4頁
文本說明成果jvm2019v1_第5頁
已閱讀5頁,還剩40頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、快速入門JVM講師:夏磊快速入門JVM請談談你對JVM的理解?java8的虛擬機有什么更新?什么是OOM?什么是StackOverflowError?有哪些方法分析?JVM的常用參數調優你知道哪些?內存快照抓取和MAT分析DUMP文件知道嗎?談談JVM中,對類加載器你的認識?JVM體系結構概述堆體系結構概述堆參數調優入門總 結Contents目錄JVM體系結構概述PART1JVM體系結構概述JVM位置JVM是運行在操作系統之上的,它與硬件沒有直接的交互JVM體系結構概述JVM體系結構概述類裝載器ClassLoader負責加載class文件,class文件在文件開頭有特定的文件標示,并且Clas

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

3、ode案例sun.misc.Launcher它是一個java虛擬機的入口應用JVM體系結構概述Execution Engine執行引擎負責解釋命令,提交操作系統執行。 JVM體系結構概述Native Interface本地接口本地接口的作用是融合不同的編程語言為 Java 所用,它的初衷是融合 C/C+程序,Java 誕生的時候是 C/C+橫行的時候,要想立足,必須有調用 C/C+程序,于是就在內存中專門開辟了一塊區域處理標記為native的代碼,它的具體做法是 Native Method Stack中登記 native方法,在Execution Engine 執行時加載native libr

4、aies。目前該方法使用的越來越少了,除非是與硬件有關的應用,比如通過Java程序驅動打印機或者Java系統管理生產設備,在企業級應用中已經比較少見。因為現在的異構領域間的通信很發達,比如可以使用 Socket通信,也可以使用Web Service等等,不多做介紹。它的具體做法是Native Method Stack中登記native方法,在Execution Engine 執行時加載本地方法庫。Native Method StackJVM體系結構概述PC寄存器每個線程都有一個程序計數器,是線程私有的,就是一個指針,指向方法區中的方法字節碼(用來存儲指向下一條指令的地址,也即將要執行的指令代碼

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

6、就Over,生命周期和線程一致,是線程私有的。8種基本類型的變量+對象的引用變量+實例方法都是在函數的棧內存中分配。棧存儲什么?棧幀中主要保存3 類數據:本地變量(Local Variables):輸入參數和輸出參數以及方法內的變量;棧操作(Operand Stack):記錄出棧、入棧的操作;棧幀數據(Frame Data):包括類文件、方法等等。JVM體系結構概述Stack 棧棧運行原理:棧中的數據都是以棧幀(Stack Frame)的格式存在,棧幀是一個內存區塊,是一個數據集,是一個有關方法(Method)和運行期數據的數據集,當一個方法A被調用時就產生了一個棧幀 F1,并被壓入到棧中,A

7、方法又調用了 B方法,于是產生棧幀 F2 也被壓入棧,B方法又調用了 C方法,于是產生棧幀 F3 也被壓入棧,執行完畢后,先彈出F3棧幀,再彈出F2棧幀,再彈出F1棧幀遵循“先進后出”/“后進先出”原則。JVM體系結構概述Stack 棧圖示在一個棧中有兩個棧幀:棧幀 2是最先被調用的方法,先入棧,然后方法 2 又調用了方法1,棧幀 1處于棧頂的位置,棧幀 2 處于棧底,執行完畢后,依次彈出棧幀 1和棧幀 2,線程結束,棧釋放。 每執行一個方法都會產生一個棧幀,保存到棧(后進先出)的頂部,頂部棧就是當前的方法,該方法執行完畢 后會自動將此棧幀出棧。JVM體系結構概述Stack 棧Exceptio

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

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

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

11、清理。若養老區執行了Full GC之后發現依然無法進行對象的保存,就會產生OOM異常“OutOfMemoryError”。如果出現java.lang.OutOfMemoryError: Java heap space異常,說明Java虛擬機的堆內存不夠。原因有二:(1)Java虛擬機的堆內存設置不夠,可以通過參數-Xms、-Xmx來調整。(2)代碼中創建了大量大對象,并且長時間不能被垃圾收集器收集(存在被引用)。堆體系結構概述堆體系結構概述堆體系結構概述堆體系結構概述永久區永久存儲區是一個常駐內存區域,用于存放JDK自身所攜帶的 Class,Interface 的元數據,也就是說它存儲的是運行

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論