1. 程式人生 > >JVM學習筆記-JVM如何工作

JVM學習筆記-JVM如何工作

JVM架構?

JVM(Java虛擬機器)充當執行Java應用程式的執行時引擎。JVM實際上是呼叫java程式碼中存在的main方法的。JVM是JRE(Java執行時環境)的一部分。

Java應用程式稱為WORA(Write Once Run Anywhere)。這意味著程式設計師可以在一個系統上開發Java程式碼,並且可以期望它在任何其他支援Java的系統上執行而無需任何調整。由於JVM,這一切都是可能的。

編譯.java檔案時,Java編譯器會生成具有相同檔名的.class檔案(包含位元組碼)。當我們執行它時,這個.class檔案會進入各個步驟。這些步驟一起描述了整個JVM。

它主要負責三項活動。

載入中
連結
初始化
載入:類載入器讀取.class檔案,生成相應的二進位制資料並將其儲存在方法區域中。對於每個.class檔案,JVM在方法區域中儲存以下資訊。

已載入類的完全限定名稱及其直接父類。
無論的.class檔案與類或介面或列舉
修改器,變數和方法資訊等
載入.class檔案後,JVM會建立一個Class型別的物件,以在堆記憶體中表示此檔案。請注意,此物件的型別為java.lang包中預定義的類。程式設計師可以使用這個Class物件獲取類級別資訊,如類名,父名,方法和變數資訊等。要獲得此物件引用,我們可以使用Object類的getClass()方法。

連結:

執行驗證,準備和(可選)解決方案。

驗證:它確保.class檔案的正確性,即它檢查此檔案是否正確格式化並由有效編譯器生成。如果驗證失敗,我們會得到執行時異常java.lang.VerifyError。
準備:JVM為類變數分配記憶體並將記憶體初始化為預設值。
解決方案:這是使用直接引用替換型別的符號引用的過程。通過搜尋方法區域來定位引用的實體來完成。
初始化:在此階段,所有靜態變數都分配有在程式碼和靜態塊(如果有)中定義的值。這在類中從上到下執行,在類層次結構中從父到子執行。
一般來說,有三個類載入器:

Bootstrap類載入器:

每個JVM實現必須有一個引導類載入器,能夠載入受信任的類。它載入JAVA_HOME / jre / lib目錄中的核心Java API類。此路徑通常稱為引導路徑。它以C,C ++等本地語言實現。
擴充套件類載入器:它是bootstrap類載入器的子代。它載入擴充套件目錄JAVA_HOME / jre / lib / ext(擴充套件路徑)中存在的類或java.ext.dirs系統屬性指定的任何其他目錄。它由sun.misc.Launcher $ ExtClassLoader類在java中實現。
系統/應用程式類載入器:擴充套件類載入器的子代。它負責從應用程式類路徑載入類。它在內部使用對映到java.class.path的Environment Variable。它也是由sun.misc.Launcher $ AppClassLoader類在Java中實現的。

相關推薦

JVM學習筆記-JVM如何工作

JVM架構? JVM(Java虛擬機器)充當執行Java應用程式的執行時引擎。JVM實際上是呼叫java程式碼中存在的main方法的。JVM是JRE(Java執行時環境)的一部分。 Java應用程式稱為WORA(Write Once Run Anywhere)。

JVM學習筆記-JVM模型

加載 tac 模型 出口 ack 引用 str mac 分配 JVM學習筆記 ==

JVM學習筆記(六)主記憶體與工作記憶體

一、    主記憶體與工作記憶體 Java記憶體模型規定了所有的變數都儲存在主記憶體中。每條執行緒還有自己的工作記憶體。執行緒對變數的所有操作都必須在工作記憶體中進行,而不能直接讀寫主記憶體中的變數。 不同執行緒之間無法直接訪問對方工作記憶體中的變數,執行緒間變數值的傳遞均

JVM學習筆記(一)數字在JVM中的表示

oat 技術 3-9 cnblogs es2017 ext ava bsp eee 數字在JVM中的表示 一、整數在JVM中的表示 1.在Java虛擬機中,整數有四種表示: byte:8位 short:16位 int:32位 long:64位

jvm學習筆記之對象詳解

時間 分代 創建 com 詳解 要求 技術 wid src 一、對象的組成            對象頭(Header):           運行時數據:存儲對象運行時的數據,如哈希碼、GC分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程ID、偏向時間戳等,這部分數據官方成為

Java學習筆記JVM的類加載機制

throws syn pan 字段 失敗 git 搜索範圍 全限定名 主動使用 1 什麽是類的加載 類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數

JVM學習筆記(二)--方法調用之靜態分配和動態分配

extends AD 找到 n! sse 運行時 面試 static sys 本篇文章從JVM的角度來理解Java學習中經常提到的重載和重寫。 方法調用:方法調用不等同於方法執行,在Java虛擬機中,方法調用僅僅是為了確定調用哪個版本的方法。方法調用分為解析調用和分派。解析

JVM學習筆記——對象的創建過程

方式 解析 內存空間 內存分配 The 自己的 自己 根據 線程安全 title: JVM學習筆記——對象的創建過程 date: 2018/9/1 16:01:35 description: 最近開始著手JVM的學習,在這裏把自己學習過程中的筆記分享出來,希望能幫到一些小夥

jvm學習筆記(1)——java虛擬機器記憶體區域

一、java記憶體區域:      1、程式計數器(執行緒私有):     記憶體中較小的記憶體空間,可以當做當前執行緒所執行位元組碼的行號指示器。如分支、迴圈、跳轉、異常處理、執行緒恢復都需要依賴這個計數器完成。 2、java虛擬機

JVM學習筆記(1)

Java虛擬機器(Java Virtual Machine) 簡稱JVM,Java虛擬機器是一個想象的虛擬機器器,通過在實際計算機上的軟體模擬來實現,一個Java虛擬機器包括一套位元組碼指令集、一組暫存器、一個棧、一個垃圾回收堆和一個儲存方法域。Java程式通過這個虛擬的機器,載入程式碼,管理程式碼

JVM學習筆記

物件的建立 首先,檢查new指令的引數是否能在常量池中定位到一個類的符號引用,並且檢查該符號引用所代表的類是否已經被載入、解析、初始化過。如果沒有,需要 執行相應的類載入過程。 其次,虛擬機器為新生物件分配記憶體。物件所需的記憶體大小在類載入完畢後便可以確定。 然後,虛擬機器需要將分配的記憶體空間都初始

JVM學習筆記三_異常初步

Java堆溢位 說明:Java堆用於儲存物件例項,只要不斷建立物件。且保證GC Roots到物件之間有可達的路徑來避免垃圾回收機制來清除這些物件,那麼在物件數量達到最大堆的容量限制之後就會產生記憶體溢位異常。 重點:模擬不斷建立物件簡單,但是需要保證創建出來的物件不被GC掉。同樣的,出錯時可能的狀況也是如

JVM學習筆記——Class類檔案解讀

簡述 Java原始碼通過編譯生成.class檔案位元組碼後再被JVM解釋轉化為目標機器程式碼,從而實現一次編寫到處,到處執行("Write Once,Run Anywhere")。位元組碼與平臺無關,而且並不是只有Java語言編譯為位元組碼檔案在虛擬機器上執行。 類檔案的

jvm學習筆記——java記憶體區域

一、java記憶體區域:      1、程式計數器(執行緒私有):     記憶體中較小的記憶體空間,可以當做當前執行緒所執行位元組碼的行號指示器。如分支、迴圈、跳轉、異常處理、執行緒恢復都需要依賴這個計數器完成。 2、java虛擬機器棧(執行緒私有):     也

jvm學習筆記(3)——java物件的記憶體分配和物件的回收(GC)

引言:         之前的文章已經提過,java物件例項是存放在堆上的,至於是在伊甸區、存活區還是老年區,這些都是從物件回收(GC)角度來進行的邏輯劃分。所以我們先說物件的回收(GC),然後再依據GC的策略來說明新的物件具體在哪個區生成。 GC(Garbage C

學習筆記 --- JVM 堆溢位、棧溢位、永久代溢位、直接記憶體溢位

棧溢位(StackOverflowError)           ---    遞迴引起  棧空間不足      ---   執行緒請求的棧

學習筆記 --- JVM 堆外記憶體(off-heap)、堆內記憶體(on-heap)

堆內記憶體(on-heap) Java中分配的非空物件都是由Java虛擬機器的垃圾收集器管理的,也稱為堆內記憶體(on-heap memory)。虛擬機器會定期對垃圾記憶體進行回收,在某些特定的時間點,它會進行一次徹底的回收(full gc)。徹底回收時,垃圾收集器會對所有分配的堆內記憶體進行完

學習筆記 --- JVM JIT與JVM,編譯器與直譯器

JVM---包括直譯器 JVM:是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種利用軟體方法實現的抽象的計算機基於下層的作業系統和硬體平臺,可以在上面執行java的位元組碼程式。 java編譯器只要面向JVM,生成JVM能理解的程式碼或位元組碼檔案。Java原始檔經編譯成

JVM學習筆記1:位元組碼指令集

一.位元組碼指令集簡介: Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(operand)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那麼java虛

JVM學習筆記2:Class檔案格式

一:class檔案概述      Class檔案是JVM的輸入,Java虛擬機器規範中定義了Class檔案的結構。Class檔案是JVM實現平臺 無關、技術無關的基礎。       1:Class檔案是一組以8位元組為單位的位元組流,各個資料專案按順序緊湊排列