JVM學習小結(一)

類加載器ClassLoader:負責加載class文件,class文件在文件開頭有特定的文件標示,將class文件字節碼內容加載到內存中,並將這些內容轉換成方法區中的運行時數據結構並且ClassLoader只負責class文件的加載,至於它是否可以運行,則由Execution Engine決定

虛擬機自帶的加載器:啓動類加載器(Bootstrap)   C++

                                    擴展類加載器(Extension)   Java

                                    應用程序類加載器(AppClassLoader)Java   也叫系統類加載器,加載當前應用的classpath的所有類

用戶自定義加載器:   Java.lang.ClassLoader的子類,用戶可以定製類的加載方式

雙親委派:當一個類收到了類加載請求,他首先不會嘗試自己去加載這個類,而是把這個請求委派給父類去完成,每一個層次類加載器都是如此,因此所有的加載請求都應該傳送到啓動類加載其中,只有當父類加載器反饋自己無法完成這個請求的時候(在它的加載路徑下沒有找到所需加載的Class),子類加載器纔會嘗試自己去加載。

  採用雙親委派的一個好處是比如加載位於 rt.jar 包中的類 java.lang.Object,不管是哪個加載器加載這個類,最終都是委託給頂層的啓動類加載器進行加載,這樣就保證了使用不同的類加載器最終得到的都是同樣一個 Object對象。雙親委派機制保證沙箱安全

  Native Interface本地接口:本地接口的作用是融合不同的編程語言爲 Java 所用,它的初衷是融合 C/C++程序,Java 誕生的時候是 C/C++橫行的時候,要想立足,必須有調用 C/C++程序,於是就在內存中專門開闢了一塊區域處理標記爲native的代碼,它的具體做法是 Native Method Stack中登記 native方法,在Execution Engine 執行時加載native libraies。     目前該方法使用的越來越少了,除非是與硬件有關的應用,比如通過Java程序驅動打印機或者Java系統管理生產設備,在企業級應用中已經比較少見。因爲現在的異構領域間的通信很發達,比如可以使用 Socket通信,也可以使用Web Service等等,不多做介紹。

 Native Method Stack本地方法棧:它的具體做法是Native Method Stack中登記native方法,在Execution Engine 執行時加載本地方法庫。

 PC寄存器:每個線程都有一個程序計數器,是線程私有的,就是一個指針,指向方法區中的方法字節碼(用來存儲指向下一條指令的地址,也即將要執行的指令代碼),由執行引擎讀取下一條指令,是一個非常小的內存空間,幾乎可以忽略不記。 這塊內存區域很小,它是當前線程所執行的字節碼的行號指示器,字節碼解釋器通過改變這個計數器的值來選取下一條需要執行的字節碼指令。 如果執行的是一個Native方法,那這個計數器是空的。 用以完成分支、循環、跳轉、異常處理、線程恢復等基礎功能。不會發生內存溢出(OutOfMemory=OOM)錯誤(記錄了方法之間的調用和執行情況,類似值日表)

Method Area 方法區:供各線程共享的運行時內存區域。它存儲了每一個類的結構信息,例如運行時常量池(Runtime Constant Pool)、字段和方法數據、構造函數和普通方法的字節碼內容。方法區是規範,在不同虛擬機裏頭實現是不一樣的,最典型的就是永久代(PermGen space)和元空間(Metaspace)。 但是實例變量存在堆內存中,和方法區無關

stack 

棧管運行,堆管存儲

棧也叫棧內存,主管Java程序的運行,是在線程創建時創建,它的生命期是跟隨線程的生命期,線程結束棧內存也就釋放,對於棧來說不存在垃圾回收問題,只要線程一結束該棧就Over,生命週期和線程一致,是線程私有的。8種基本類型的變量+對象的引用變量+實例方法都是在函數的棧內存中分配。

java  方法=棧幀

Exception in thread "main" java.lang.StackOverflowError

一個JVM實例只存在一個堆內存,堆內存的大小是可以調節的。類加載器讀取了類文件後,需要把類、方法、常變量放到堆內存中,保存所有引用類型的真實信息,以方便執行器執行。

堆內存邏輯上分爲三部分(java8):新生+養老+元空間(java8以前是永久代)  物理上是新生+養老

新生區又分爲Eden(伊甸園)空間和兩塊較小的Survivor(倖存者)空間,每次使用Eden和其中一塊Survivor(兩個Survivor區域一個稱爲From區,另一個稱爲To區域),8:1:1  新生佔1/3 堆空間  老年佔 2/3 堆空間

MinorGC的過程(複製->清空->互換)

堆內存調優:-Xms:設置初始分配大小,默認爲物理內存的“1/64”

                      -Xmx:最大分配內存,默認爲物理內存的“1/4” 

調節VM參數:    -Xms1024m -Xmx1024m -XX:+PrintGCDetails

 

 

 

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