1. 程式人生 > 實用技巧 >jvm小結2

jvm小結2

JVM

原始碼 → 位元組碼檔案

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

調優總結:

年輕代大小選擇:

響應時間優先的應用:

吞吐量優先的應用:

年老代大小選擇: