前言
根據狂神說的JVM快速入門做了以下筆記,講的很好的一個博主,給小伙伴們附上視頻鏈接狂神說JVM快速入門
接下來我按照他所講的內容給大家記錄一些重點!
一、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; //在堆疊記憶體開辟空間給參考變數stu
stu = new Student(); //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開始常量池從方法區中移了出來,在堆中開辟區域存放運行時的常量池,)
未完待續-----
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243824.html
標籤:java
下一篇:極驗驗證(滑動驗證)的使用
