標籤:類 虛擬機器 jvm 類載入機制
最近在重新回顧java基礎,對java運行時整個記憶體啟動並執行機制很好奇,看了一點深入理解java虛擬機器 進階特性和最佳實務,覺得整個jvm運行機制還是比較複雜的。待日後有時間再好好深入瞭解,暫時先在站在理解程式的層級上簡述一下。
首先先是運行時的java的記憶體地區
簡單講一下各個地區
程式計數器:當前線程所執行的位元組碼的行號指標,迴圈,線程恢複等基礎功能依賴這個計數器完成(線程私人,每一個線程都會有自己單獨的一個計數器)。
本地方法棧:與java虛擬機器棧相似,不過執行的是native方法。
方法區(包含運行時常量池):各個線程共用的地區,它用於已被虛擬機器載入的類資訊,常量,靜態變數,即時編譯器編譯後的代碼等資料。
java虛擬機器棧:也是線程私人的,生命週期與線程相同 每個方法執行時都會建立一個棧幀(一會兒會詳細講到)結構是棧結構,先進後出。
java堆:被線程共用 java虛擬機器管理的記憶體中最大的一塊,幾乎所有的對象執行個體都在這裡分配記憶體,也是java垃圾收集器主要管理的地區。
運行時常量池:方法區的一部分 主要存放類的版本,欄位,方法,介面等描述資訊和常量池。常量池裡在類載入後進入運行時常量,裡面存放編譯期產生的各種字面量和符號引用等。
然後就是類的載入過程
類載入時機通常在
1.new建立執行個體時
2.調用該類的靜態方法
3.Class.forname("");
.....(當類初始化時,會將他的父類一起初始化)
類的載入整個分為三個部分 1. 載入
類載入器將位元組碼檔案讀入記憶體,並建立一個java.lang.Class對象
2. 串連 (1)驗證 (2)準備
為類的靜態Field分配記憶體,設定系統預設初始值
(3)解析
將常量池中的符號引用替換為直接引用
3. 初始化(主要是對staticField進行初始化)
1 2
1圖的最後i值為3
2圖的最後i值為2
根據順序進行賦值,但1圖中static代碼塊可以操作i變數,2圖中不行,static代碼塊只對i進行賦值。