JVM快速入門 一、JVM體系結構 二、對象實例化過程 三、對象實例化實質 四、雙親委派機制 四、Native本地方法 五、虛擬機棧 六、堆 七、結合棧和堆談談實例化過程

一、JVM體系結構

.java經由javac變爲class字節碼文件,再通過類加載器加載.對於類加載器我進行了總結.

1.類加載器

我們都知道java程序寫好以後是以.java(文本文件)的文件存在磁盤上,然後,我們通過(bin/javac.exe)編譯命令把.java文件編譯成.class文件(字節碼文件),並存在磁盤上。但是程序要運行,首先一定要把.class文件加載到JVM內存中才能使用的,我們所講的classLoader,就是負責把磁盤上的.class文件加載到JVM內存中.

2.ClassLoader 層次結構

類加載器有三種:

(1)根類加載器(null)

它是由本地代碼(c/c++)實現的,你根本拿不到他的引用,但是他實際存在,並且加載一些重要的類,它加載(%JAVA_HOME%\jre\lib),如rt.jar(runtime)、i18n.jar等,這些是Java的核心類。

(2)平臺類加載器(PlatformClassLoader)(jdk1.8之後的版本,之前的稱爲擴展類加載器 ExtClassLoader)

雖說能拿到,但是我們在實踐中很少用到它,它主要加載擴展目錄下的jar包, %JAVA_HOME%\lib\ext

(3)應用類加載器(appClassLoader)

它主要加載我們應用程序中的類,如Test,或者用到的第三方包,如jdbc驅動包等。這裏的父類加載器與類中繼承概念要區分,它們在class定義上是沒有父子關係的。

3.Class 加載時調用類加載器的順序

當一個類要被加載時,有一個啓動類加載器和實際類加載器的概念,這個概念請看如下分析:

如上面的Test.class要進行加載時,它將會啓動應用類加載器進行加載Test類,但是這個應用類加載器不會真正去加載它,而是會調用看是否有父加載器,結果有,是擴展類加載器,擴展類加載器也不會直接去加載,它看自己是否有父加載器沒,結果它還是有的,是根類加載器。

所以這個時候根類加載器就去加載這個類,可是在%JAVA_HOME%\jre\lib下,它找不到dir_b.Test這個類,所以他告訴他的子類加載器,我找不到,你去加載吧,子類擴展類加載器去%JAVA_HOME%\lib\ext去找,也找不着,它告訴它的子類加載器 AppClassLoader,我找不到這個類,你去加載吧,結果AppClassLoader找到了,就加到內存中,並生成Class對象。這也是 Java 中著名的委託加載機制.

4.流程圖

紅框區域不會有垃圾回收,所謂的調優99%都是在堆與方法區(特殊的堆)。

二、對象實例化過程

Student stu;//在棧內存開闢空間給引用變量stustu=newStudent();//new Student()在堆內存裏面開闢了空間給Student類的對象,Student()隨即調用Student類中的構造函數,把Student類對象在堆內存的地址給引用變量stu

    類經過ClassLoader加載,再實例化出具體實例,在棧內存開闢空間給引用變量stu,new Student()在堆內存裏面開闢了空間給Student類的對象,Student()隨即調用Student類中的構造函數,把Student類對象在堆內存的地址給引用變量stu

三、對象實例化實質

通過反射(對應圖中getClass)介紹了同一類的Class模板都是一樣的,hashcode一樣。

new實例化(對應圖中nuw)之後纔是具體的,hashcode不同

類加載器要進行加載時,它將會啓動應用類加載器進行加載Test類,但是這個應用類加載器不會真正去加載它,而是會調用看是否有父加載器,結果有,是擴展類加載器,擴展類加載器也不會直接去加載,它看自己是否有父加載器沒,結果它還是有的,是根類加載器。

以下代碼探究了三種加載器

四、雙親委派機制

通過重寫toString,介紹了雙親委派機制

運行不成功,因爲類加載時會一直向上委託,在根加載器中找到了toString並運行,發現沒有主函數

四、Native本地方法

介紹了native本地方法:用於調用底層用C寫的庫

五、虛擬機棧

棧細分成棧幀

六、堆

堆分成了eden、s0、s1、tentired.

左邊爲JDK8以後永久存儲區變爲元空間(整體如此,還是有些細微區別)

七、結合棧和堆談談實例化過程

    往棧創建引用變量,在堆中創建實例,實例指向方法區中的常量池(例如實例有name屬性,name=“Apollo”,這個“Apollo”字符串就在常量池中,1.7開始常量池從方法區中移了出來,在堆中開闢區域存放運行時的常量池。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章