輕鬆搞定java記憶體模型(二)類的載入以及初始化
上一篇我們隊java虛擬記憶體構成做了基本的介紹,本篇就以HotSpot虛擬機器為例,分析下一個物件從建立到被銷燬的過程。本篇主要講解類的載入過程。
1:類的載入過程
類的載入過程大概可以分為一下三步:裝載,連結,初始化。
A:裝載,即查詢並記載類的二進位制資料(.class)檔案。
B:連結,連結分為一下三步:
驗證:確保被載入類的正確性;
準備:為類的靜態變數分配記憶體,並將其初始化為預設值;
解析:把類中的符號引用轉換為直接引用;
C:初始化:為類的靜態變數賦予正確的初始值;
2:類載入器
類裝載器就是尋找類的位元組碼檔案並構造出類在jvm內部表示的物件元件,主要工作由ClassLoader
類載入器分為四類:
1)BootstrapClassLoader
負責載入$JAVA_HOME中jre/lib/rt.jar裡所有的class,由C++實現,不是ClassLoader子類
2)Extension ClassLoader
負責載入java平臺中擴充套件功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包
3)App ClassLoader
負責記載classpath中指定的jar包及目錄中class
4)Custom ClassLoader
屬於應用程式根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規範自行實現ClassLoader
載入過程中會先檢查類是否被已載入,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已載入就視為已載入此類,保證此類只所有ClassLoader載入一次。而載入的順序是自頂向下,也就是由上層來逐層嘗試載入此類。
3:類的真正初始化
我們可以注意到上文1中的類載入過程中的初始化只是為類的靜態變數賦予正確的值,也就是說整個物件並沒有真正的初始化。
所有的java虛擬機器實現必須在每個類或介面被java程式“首次主動使用”時才初始化它們。
其中的主動使用有以下六種情況:
A:建立類的例項
B:訪問某個類或介面的靜態變數,或者對該靜態變數賦值。
C:呼叫類的靜態方法
D:反射
E:初始化一個類的子類
F:java虛擬機器啟動時被標明為啟動類的類
也就是經過以上的首次主動使用後才能真正的在java堆中建立一個物件。
小結:
類的載入指的是將類的.class檔案中的二進位制資料讀入到記憶體中,將其存放在執行時期的方法區內,然後在堆中建立一個java.long.class物件,用來封裝類在方法區內的資料結構。
也就是說類的載入最終產品是位於堆中的class物件,Class物件封裝了類在方法區的資料結構,並且提供了訪問方法區內資料結構的介面。通俗點來說,堆就是我們的現實世界,其中的物件就是一個個物體,而方法區就是一面鏡子,其中映射了堆中物件的結構。
正是因為方法區的存在,我們可以通過反射機制來實現各種動態載入類,可以通過反射獲取一個類的所有資訊。
相關推薦
輕鬆搞定java記憶體模型(二)類的載入以及初始化
上一篇我們隊java虛擬記憶體構成做了基本的介紹,本篇就以HotSpot虛擬機器為例,分析下一個物件從建立到被銷燬的過程。本篇主要講解類的載入過程。 1:類的載入過程 類的載入過程大概可以分為一下
輕鬆搞定java記憶體模型(一)基本組成
Java記憶體大概模型如上圖,包含五大部分,其中方法區和堆是執行緒共享的,虛擬機器棧,本地方法棧,程式計數器是執行緒私有的。 1:程式計數器 程式計數器可以看做當前執行緒所執行的位元組碼(可以簡單
深入理解Java記憶體模型(二)——重排序
資料依賴性 如果兩個操作訪問同一個變數,且這兩個操作中有一個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴分下列三種類型: 名稱 程式碼示例 說明 寫後讀 a = 1;b = a; 寫一個變數之後,再讀這個位置。 寫後寫 a = 1;a = 2; 寫一個變數之後,再寫這
Java程式設計師從笨鳥到菜鳥之(九十三)深入java虛擬機器(二)——類載入器詳解(上)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
深入理解Java虛擬機器(二)——類載入器深入解析
類載入過程 •類載入:類載入器將class檔案載入到虛擬機器的記憶體 •載入:在硬碟上查詢並通過IO讀入位元組碼檔案 •連線:執行校驗、準備、解析(可選)步驟 •校驗:校驗位元組碼檔案的正確性
Java 記憶體模型(JMM)
一、概述 Java 記憶體模型(Java Memory Model)描述了一組規則或規範,定義了 JVM 將變數儲存到記憶體和從記憶體中取出變數這樣的底層細節,值得注意的是,這裡的變數指的是共享變數(例項欄位、靜態欄位、陣列物件元素),不
深入理解Java記憶體模型(六)——final
與前面介紹的鎖和volatile相比較,對final域的讀和寫更像是普通的變數訪問。對於final域,編譯器和處理器要遵守兩個重排序規則: 在建構函式內對一個final域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序。 初次讀一個包含
JVM記憶體模型(二)—— HotSpot虛擬機器分析
上一節我們講了Java虛擬機器的理論記憶體模型,同時我們也提到了,這些只是Java虛擬機器規範中的內容,如果我們要研究一個物件是如何建立、如何佈局等一系列細節問題的時候,我們就必須在具體的虛擬機器中分析,因為不同的虛擬機器的實現是不一樣的,下面我們就選最常用、最普遍的虛擬機器
JVM——記憶體模型(二):虛擬機器棧與本地方法棧
本篇文章將繼續認識Java虛擬機器中的記憶體模型,今天要認識的是我們常說的"棧”。 棧其實也分兩種,一種是虛擬機器棧,一種是本地方法棧。而我們平常說的最多的,就是虛擬機器棧。接下來就讓我們走進這兩個棧,看看他們是個啥。 1.虛擬機器棧 虛擬機器棧,即Java Virtual&n
同步和Java記憶體模型(五)Volatile
作者:Doug lea 譯者:杜建雄校對者:方騰飛 Volatile 從原子性,可見性和有序性的角度分析,宣告為volatile欄位的作用相當於一個類通過get/set同步方法保護普通欄位,如下: final class VFloat { private float value;
深入理解Java記憶體模型(四)——volatile
volatile的特性 當我們宣告共享變數為volatile後,對這個變數的讀/寫將會很特別。理解volatile特性的一個好方法是:把對volatile變數的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步。下面我們通過具體的示例來說明,請看下面的示例程式碼: class Vol
深入理解Java記憶體模型(一)——基礎
併發程式設計模型的分類 在併發程式設計中,我們需要處理兩個關鍵問題:執行緒之間如何通訊及執行緒之間如何同步(這裡的執行緒是指併發執行的活動實體)。通訊是指執行緒之間以何種機制來交換資訊。在指令式程式設計中,執行緒之間的通訊機制有兩種:共享記憶體和訊息傳遞。 在共享記憶體的併發模型裡,執行緒之
深入理解Java記憶體模型(三)——順序一致性
資料競爭與順序一致性保證 當程式未正確同步時,就會存在資料競爭。java記憶體模型規範對資料競爭的定義如下: 在一個執行緒中寫一個變數, 在另一個執行緒讀同一個變數, 而且寫和讀沒有通過同步來排序。 當代碼中包含資料競爭時,程式的執行往往產生違反直覺的結果(前一章的示例正是如此)。如果一
深入理解Java記憶體模型(七)——總結
處理器記憶體模型 順序一致性記憶體模型是一個理論參考模型,JMM和處理器記憶體模型在設計時通常會把順序一致性記憶體模型作為參照。JMM和處理器記憶體模型在設計時會對順序一致性模型做一些放鬆,因為如果完全按照順序一致性模型來實現處理器和JMM,那麼很多的處理器和編譯器優化都要被禁止,這對執行效能
深入理解Java記憶體模型(五)——鎖
鎖的釋放-獲取建立的happens before 關係 鎖是java併發程式設計中最重要的同步機制。鎖除了讓臨界區互斥執行外,還可以讓釋放鎖的執行緒向獲取同一個鎖的執行緒傳送訊息。下面是鎖釋放-獲取的示例程式碼: class MonitorExample { int a = 0;
淺談快取一致性原則和Java記憶體模型(JMM)
Java記憶體模型(JMM)是一個概念模型,底層是計算機的暫存器、快取記憶體、主記憶體和CPU等。 多處理器環境下,共享資料的互動硬體裝置之間的關係: JMM: 從以上兩張圖中,談一談以下幾個概念: 1.快取一致性協議(MESI): 由於每個處
Springboot(9)輕鬆搞定跨域訪問(CORS)
原始碼地址 CORS實現跨域訪問 方式1:返回新的CorsFilter 方式2:重寫WebMvcConfigurer 方式3:使用註解(@CrossOrigin) 方式4:手工設定響應頭(HttpServletResponse )
Java記憶體模型(JMM)
Java記憶體模型 概念 記憶體模型(memory model):在特定的操作協議下,對特定的記憶體或快取記憶體進行讀寫訪問的過程抽象。 作用 java記憶體模型的主要目標是定義程式中各個變數的
從單例模式挖到記憶體模型(二)----指令重排序
首先是一個雙檢鎖寫的單例模式的例子: public class Single{ private volatile static Single single; private Single(){} public static Single getInstance(){
JAVA基礎複習(二)類、方法、字串
1、類使用變數定義資料域,使用方法定義動作,構造方法為了完成初始化動作 2、構造方法三個特徵:具備和所在類相同的名字;沒有返回值型別,連void也沒有;在建立一個物件使用new操作符時呼叫,可以有多個同名的構造方法要有不同的引數列表 3、引用型資料域預設值是null,數值型資料域預設值是0,