jvm小結2
原始碼 → 位元組碼檔案
classloader裝載
類的載入過程:
-
裝載
查詢並裝載型別的二進位制資料
-
連結
verify, 驗證確保class檔案位元組流中資訊符合當前虛擬機器要求
prepare,為類變數分配記憶體並將其初始化為預設初始值
①類變數(也叫靜態變數): 被 static 修飾的變數; 其他所有型別的變數都屬於 類成員變數
②類變數初始化預設值, 而常量(static final)被直接賦予使用者希望的值
resolve,把常量池中的符號引用轉換為記憶體中的直接引用
-
初始化
按語句執行順序對類物件進行初始化;執行類構造器方法;把靜態變數初始化為正確初始值;
啟動類載入器(Bootstrap ClassLoader):
c/c++實現的,巢狀在JVM內部;
載入Java核心庫;
只加載包名為java,javax,sun等開頭的類
使用者自定義類載入器:
繼承自ClassLoader
擴充套件類載入器(Extentsion ClassLoader):
java實現;
父類載入器是啟動載入器;
系統類載入器(AppClassLoader):
父類載入器是擴充套件類載入器;
該類載入是程式中預設的類載入器,一般來說,java應用的類都是由它來完成載入
雙親委派機制
某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴
避免類的重複載入;對java核心原始碼的保護(沙箱安全機制);
JVM系統執行緒(hotspot):
虛擬機器執行緒
週期任務執行緒
週期任務執行緒
GC執行緒
編譯執行緒
訊號排程執行緒
-
確定類變數的初始值。在類載入的準備階段,JVM 會為類變數初始化零值,這時候類變數會有一個初始的零值。如果是被 final 修飾的類變數,則直接會被初始成使用者想要的值。
-
初始化入口方法。當進入類載入的初始化階段後,JVM 會尋找整個 main 方法入口,從而初始化 main 方法所在的整個類。當需要對一個類進行初始化時,會首先初始化類構造器(),之後初始化物件構造器()。
-
初始化類構造器。JVM 會按順序收集類變數的賦值語句、靜態程式碼塊,最終組成類構造器由 JVM 執行。
-
初始化物件構造器。JVM 會按照收整合員變數的賦值語句、普通程式碼塊,最後收集構造方法,將它們組成物件構造器,最終由 JVM 執行。
資料型別:
基本型別:變數儲存原始值
引用型別:變數儲存引用值,物件本身放在這個引用值所表示的地址的位置
堆與棧:
棧是執行時的單位,存的是:基本資料型別,對重物件的引用
堆是儲存的單位,存的是:物件
Java物件大小:
java中一個空oject物件的大小是8byte,java棧儲存引用需要4byte
Object ob = new Object();
//Object物件(8byte)+引用(4byte)=12byte
Class NewObject{
int count;
boolean flag;
Object ob;
}
// 空物件大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte
//但是因為Java在對物件記憶體分配時都是以8的整數倍來分,因此此物件的大小為24byte
年輕代(yong generation)
年老代(old generation)
持久代(permanent generation)
Scavenge GC
Full GC
調優總結:
年輕代大小選擇:
響應時間優先的應用:
吞吐量優先的應用:
年老代大小選擇: