JVM基础知识
JVM簡介
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。 JVM屏蔽了與具體操作系統平臺相關的信息,使Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。JVM在執行字節碼時,實際上最終還是把字節碼解釋成具體平臺上的機器指令執行。編譯虛擬機的指令集與編譯微處理器的指令集非常類似。
JDK內存
Java 的內存模型分為 Young(年輕代也叫new區)
Young分為 Eden 區和兩個Survivor 區(from和to,這兩個Survivor區大小嚴格一至),新的對象實例總是首先放在Eden 區,Survivor區作為Eden區和Tenure(終生代)的緩沖,可以向 Tenure(終生代)轉移活動的對象實例。 Tenured(終身代,也叫old區)
Tenure中存放生命周期長久的實例對象,但并不是如它的名字那樣是終生的,里面的對象照樣會被回收掉。
Young和Tenure共同組成了堆內存,也就是heap內存或heap區。 Perm(永久代) 有些舊版本也叫作:New Old Perm 叫法不同,表達的意思卻是基本相同。Perm則是非堆內存的組成部分。主要存放加載的Class類級對象如class本身,method,field等等。 Virtual區 在JVM啟動時,就已經保留了固定的內存空間給Heap內存,這部分內存并不一定都會被JVM使用,但是可以確定的是這部分保留的內存不會被其他進程使用。這部分內存大小由 -Xmx 參數指定。 而另一部分內存在JVM啟動時就分配給JVM,作為JVM的初始Heap內存使用。影響這個的參數是 -Xms ,如果 -Xms 指定的值比-Xmx 的小,那么兩者的差值就是Virtual內存值。隨著程序的運行,Eden區,Tenured區和Perm區會逐漸使用保留的Virtual空間。 如果沒有具體指定,初始和最大堆內存將根據機器的內存計算得出。參數DefaultInitialRAMFraction 和 DefaultMaxRAMFraction 會影響最終的結果,如下表所示: FormulaDefault initial heap size memory / DefaultInitialRAMFraction memory / 64 maximum heap size MIN(memory / DefaultMaxRAMFraction, 1GB) MIN(memory / 4, 1GB) 可以看到堆內存默認值最大不會超過1G。 JVM會根據堆內存的使用情況自動決定何時擴張和縮減實際堆內存的大小,可以用VM參數 -XX:MinHeapFreeRatio= 和 -XX:MaxHeapFreeRatio= 使用堆內存空閑百分比來定義,一般在32位機器上的默認值如下: ParameterDefault Value MinHeapFreeRatio 40 MaxHeapFreeRatio 70 -Xms 3670k -Xmx 64m -Xms/-Xmx: java heap并不是越大越好,對他的一般優化原則是夠用的情況下,盡可能的小,因為太大的話會浪費內存,同時影響GC的效率。當空閑堆內存所占堆內存百分比低于40%,JVM就會試圖擴張堆內存空間;當空閑堆內存所占堆內存百分比高于70%,JVM就會試圖壓縮堆內存空間。 ps:以上默認值在不同平臺會有不同的值,如果是64位系統,這些值一般需要擴張30%,來容納在64位系統下變大的對象。 GC
GC是Garbage Collection的縮寫,即垃圾回收機制,在Java中開發人員無需使用指針來管理內存,GC是JVM對內存(實際上就是對象)進行管理的方式。 第一種為單線程GC,也是默認的GC。,該GC適用于單CPU機器。 第二種為Throughput GC,是多線程的GC,適用于多CPU,使用大量線程的程序。第二種GC與第一種GC相似,不同在于GC在收集Young區是多線程的,但在Old區和第一種一樣,仍然采用單線程。-XX:+UseParallelGC參數啟動該GC。 第三種為Concurrent Low Pause GC,類似于第一種,適用于多CPU,并要求縮短因GC造成程序停滯的時間。這種GC可以在Old區的回收同時,運行應用程序。-XX:+UseConcMarkSweepGC參數啟動該GC。
第四種為Incremental Low Pause GC,適用于要求縮短因GC造成程序停滯的時間。這種GC可以在Young區回收的同時,回收一部分Old區對象。-Xincgc參數啟動該GC。 不管采用什么算法,GC總是會導致應用暫停的,這個時間長短從毫秒到秒之間不等,因此會影響應用的相應時間,多長的停頓在接受范圍內取決于應用的特征,可以通過設置GC停頓的時間來調整(注意只是期望的時間,而不是絕對)
相關調整的目標: 短生命周期的對象不要進入Old區 短生命周期的對象在minor GC的時候干掉 長生命周期的對象要放到Old區 長生命周期的對象可以被Full GC清理掉,但是Full GC要調整到盡量少發生
JVM中的ClassLoader
類加載器(class loader)用來加載java類到java虛擬機中。一般來說,java虛擬機使用java類的方式如下:Java源程序(.java文件)在經過java編譯器編譯之后就被轉換成java字節代碼(.class文件)。類加載器負責讀取Java字節代碼,并轉換成java.lang.class類的一個實例。每個這樣的實例用來表示一個java類。
Java程序是由許多獨立的類文件組成的,每個文件對應于一個java類。此外,這些文件并非立即全部加載如內存,而是根據程序需要裝入內存。ClassLoader便是JVM中將類裝入內存的零件,用戶可以定制自己的ClassLoader。JVM中缺省的ClassLoader可以完成將本地已文件系統裝入類文件的任務。用戶指定的ClassLoader可以擁有JVM缺省的ClassLoader所不具有的功能。例如:用戶可以使用自己創建的ClassLoader從非本地硬盤或者從網絡裝入可執行內容。
java應用環境中不同的class分別由不同的ClassLoader負責加載。 一個jvm中默認的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分別各司其職: Bootstrap ClassLoader:用來在JVM啟動時加載核心類庫,主要是 %JRE_HOME/lib/ 目錄下的rt.jar、resources.jar、charsets.jar和class等 Extension ClassLoader:負責加載java擴展類,主要是%JRE_HOME/lib/ext目錄下的jar和class App ClassLoader:負責加載當前java應用classpath變量中的所有類。 其中Bootstrap ClassLoader是JVM級別的,由C++編寫;Extension ClassLoader、App ClassLoader都是java類,都繼承自URLClassLoader超類。 Bootstrap ClassLoader由JVM啟動,然后初始化sun.misc.Launcher ,sun.misc.Launcher初始化Extension ClassLoader、App ClassLoader。 下圖是ClassLoader的加載類流程圖,以加載一個類的過程類示例說明整個ClassLoader的過程。
Java 類加載器層次結構? 類加載器包含具有父類加載器和子類加載器的層次結構。父類加載器和子類加載器之間的關系類似于超類和子類之間的對象關系。引導類加載器是 Java 類加載器層次結構的根。Java 虛擬機 (JVM) 創建引導類加載器,它將加載 JVM 中包含的 Java Development Kit (JDK) 內部類和 java.* 包。(例如,引導類加載器加載 java.lang.String。) 擴展類加載器是引導類加載器的子類加載器。擴展類加載器加載 JDK 的擴展目錄中包含的所有 JAR 文件。這是一種無需在類路徑中添加條目即可擴展 JDK 的便捷方法。但擴展目錄中的所有內容都必須是自包含的,且只能引用擴展目錄中的類或 JDK 類。
系統類路徑類加載器擴展 JDK擴展類加載器。系統類路徑類加載器加載 JVM 類路徑中的類。 加載類? 類加載器在加載類時使用委托模型。類加載器實現首先檢查其緩存,查看是否已經加載所請求的類。由于不重復從磁盤中加載類,而是使用該類在緩存內存中的副本,所以,這種類驗證可以提高性能。如果在類緩存中找不到該類,則當前類加載器會要求其父類加載器提供該類。僅當父類加載器也無法加載該類時,該類加載器才會嘗試加載該類。如果某個類既存在于父類加載器中,又存在于子類加載器中,則將加載父類加載器中的類。遵循這種委托模型可以避免同時加載多份相同的類。加載多份相同的類會引發 ClassCastException。 類加載器會先要求其父加載器加載類,然后再嘗試自己加載該類。
參考至:《叱咤風云:WebLogic企業級運維實戰》戴冠平著
???????????? http://longdick.iteye.com/blog/442213
?????????????http://songyishan.iteye.com/blog/1135183
?????????????http://hi.baidu.com/love200456/blog/item/9d4d70fbdc38c970024f564f.html
?????????????http://blog.sina.com.cn/s/blog_677e5328010109a3.html 本文原創,轉載請注明出處、作者 如有錯誤,歡迎指正 郵箱:czmcj@163.com
轉載于:https://www.cnblogs.com/dim2046/p/5920066.html
總結
- 上一篇: Nagios LDAP用户pager被清
- 下一篇: linux yum下载RPM包后再安装L