Java虛擬機那些事(2)

性能監控與故障處理工具

 JDK命令行工具

jps:虛擬機進程情況工具java

jstat:虛擬機統計信息監視工具bootstrap

jinfo:java配置信息工具安全

jmap:用於生成堆轉儲快照數據結構

jhat:虛擬機堆轉儲快照分析工具app

jstack:java堆棧跟蹤工具工具

JDK可視化工具

jconsole性能

visualVMspa

類文件結構

1.魔數:這頭四個字節惟一的做用是肯定這個文件是否爲一個能被虛擬機接受的文件。命令行

2.次版本號和主版本號對象

3.常量池入口和容量計數器。常量池主要存放兩大類常量:字面量和符號引用。

字面量:文本字符串,被聲明爲final的常量值。

符號引用(編譯原理方面的概念):類和接口的全限定名,字段的名稱和描述符,方法的名稱和描述符。

4.訪問標記:用於識別一些類或接口層次的訪問信息

5.類索引、父類索引與接口索引集合:肯定這個類的繼承關係

6.字段表集合

7.方法表集合

8.屬性表集合

虛擬機類加載機制

虛擬機把描述類的數據從Class文件加載到內存,並對數據進行校驗、轉換解析和初始化,最終造成能夠被虛擬機直接使用的java類型。

與那些在編譯時須要進行鏈接工做的語言(如C++)不一樣,java語言中,類型的加載和鏈接過程是在程序運行時完成的,這會增長一些性能開銷,可是帶來了更高的靈活性。

類加載的過程

1.加載:經過類的全限定名來獲取定義此類的二進制字節流,將這個字節流所表明的靜態存儲轉換爲方法區的運行時數據結構,在java堆中生成了一個表明這個類的java.lang.Class對象,做爲方法區這些數據的訪問入口。

2.驗證:確保Class文件的字節流中包含的信息符合當前虛擬機的要求,而且不會危害虛擬機自身的安全。文件格式驗證,元數據驗證(語義分析),字節碼驗證,符號引用驗證。

3.準備:爲類變量分配內存並設置類變量初始值,這些內存將在方法區進行分配。

4.解析:將常量池內的符號引用替換爲直接引用的過程。類或接口的解析,字段解析,類方法解析,接口方法解析。

5.初始化:最後一步

類加載器

三種系統提供的類加載器:

1.啓動類加載器(bootstrap classloader):加載JAVA_HOME/lib目錄下的類庫,沒法被java程序使用。

2.擴展類加載器(extension classloader):加載JAVA_HOME/lib/ext目錄下的類庫。

3.應用程序類加載器(application classloader):也稱爲系統類加載器,它負載加載用戶路徑上所指定的類庫。它是程序中默認的類加載器。

固然也能夠自定義類加載器

雙親委派模型:若是一個類加載器收到了類加載的請求,它首先不會本身去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此。所以全部的加載請求最終會傳達到頂層的啓動類加載器中,只有加載器反饋本身沒法完成這個加載請求時(找不到所需的類),子加載器纔會嘗試去加載。

緣由:避免混亂。由於就算是同一個類,不一樣加載器加載的話,也會被認爲是兩個不一樣的類。

 關於方法區的一些補充

 其實,從Java7開始就對方法區進行了一些調整;到Java8, 方法區的概念已經沒有了,取而代之的是元空間MetaSpace這個概念。

Java7

符號引用:被挪到了本地內存

常量池和類的靜態變量:被挪到了java堆

 Java8

類信息被挪到了本地內存區域,至次,方法區移除工做完成。

能夠經過-XX:MetaspaceSize和-XX:MaxMetaspaceSize來進行調整元空間的大小。當超過大小設置時,會對死亡的類加載器和類進行GC 。

每一個類加載器存儲區稱爲一個metaspace,會回收整個類加載器,減小碎片。

相關文章
相關標籤/搜索