圖解JAVA物件的建立過程
前面幾篇博文分別介紹了JAVA的Class檔案格式、JVM的類載入機制和JVM的記憶體模型,這裡就索性把java物件的建立過程一併說完,這樣java物件的整個建立過程就基本上說明白了(當然你要有基礎才能真正看明白)。經常有人問我為什麼這麼喜歡鑽研底層的東西,首先,因為我以前的做硬體的和嵌入式的,興趣使然;其次,我個人感覺,如果不把上下打通,心裡老是有一堵牆過不去,說白了,這是個人因素,與好壞無關(當然,經常有人說,懂底層原理是成為高手的必經之路)。
現在來說一下我當初學習JVM的原因,在學習JAVA之前,我只學過C/C++,當我接觸JAVA之後,發現JAVA與C++之間有著巨大的差異,其中最困惑我的就是C++的繼承和JAVA的繼承實現原理是否一樣(物件如何最終定位到欄位,無論這個欄位是自身的還是繼承過來的)?多型的實現機制是否相同?等等。因為之前看過《深度探索C++物件模型》,對C++的物件模型略知一二(一直打算寫一個C++物件模型的文章,苦於沒時間,後面一定補上),所以我感覺JVM可以解答我的疑惑。
關於物件的建立過程一般是從new指令(我說的是JVM的層面)開始的(具體請看圖1),JVM首先對符號引用進行解析,如果找不到對應的符號引用,那麼這個類還沒有被載入,因此JVM便會進行類載入過程(具體載入過程可參見我的另一篇博文)。符號引用解析完畢之後,JVM會為物件在堆中分配記憶體,HotSpot虛擬機器實現的JAVA物件包括三個部分:物件頭、例項欄位和對齊填充欄位(具體內容請看圖2),其中要注意的是,例項欄位包括自身定義的和從父類繼承下來的(即使父類的例項欄位被子類覆蓋或者被private修飾,都照樣為其分配記憶體)。相信很多人在剛接觸面向物件語言時,總把繼承看成簡單的“複製”,這其實是完全錯誤的。JAVA中的繼承僅僅是類之間的一種邏輯關係(具體如何儲存記錄這種邏輯關係,則設計到Class檔案格式的知識,具體請看我的另一篇博文),唯有建立物件時的例項欄位,可以簡單的看成“複製”。
為物件分配完堆記憶體之後,JVM會將該記憶體(除了物件頭區域)進行零值初始化,這也就解釋了為什麼JAVA的屬性欄位無需顯示初始化就可以被使用,而方法的區域性變數卻必須要顯示初始化後才可以訪問。最後,JVM會呼叫物件的建構函式,當然,呼叫順序會一直上溯到Object類。
至此,一個物件就被建立完畢,此時,一般會有一個引用指向這個物件。在JAVA中,存在兩種資料型別,一種就是諸如int、double等基本型別,另一種就是引用型別,比如類、介面、內部類、列舉類、陣列型別的引用等。引用的實現方式一般有兩種,具體請看圖3。此處說一句題外話,經常用人拿C++中的引用和JAVA的引用作對比,其實他們兩個只是“名稱”一樣,本質並沒什麼關係,C++中的引用只是給現存變數起了一個別名(引用變數只是一個符號引用而已,編譯器並不會給引用分配新的記憶體),而JAVA中的引用變數卻是真真正正的變數,具有自己的記憶體空間,只是不同的引用變數可以“指向”同一個物件而已。因此,如果要拿C++和JAVA引用物件的方式相對比,C++中的指標倒和JAVA中的引用如出一轍,畢竟,JAVA中的引用其實就是對指標的封裝。
注:本文為原創博文,轉載請註明出處。
圖1 物件的建立過程
圖2 物件的組成結構
圖3 物件引用的兩種實現方式
相關推薦
Java物件建立過程
物件的建立過程 物件的建立當虛擬機器遇到一條new指令時,首先將去檢查這個指令的引數是否能在常量池中定位到某個類的符號引用,並且檢查這個符號引用代表的類是否已被載入、解析、初始化。 物件記憶體的分配如果沒有,則必須先執行相應的類載入過程,當類載入檢查通過後,虛擬機
Java物件建立過程和記憶體結構分析
JAVA記憶體分配和管理是JAVA的核心技術之一,在看了尚矽谷宋紅康老師講解的JAVA記憶體知識之後,結合《深入理解JVM這本書》對自己所學的知識進行簡單的總結,寫了這篇日誌。 1.JAVA記憶體分割槽 根據儲存資料的不同,java記憶體通常被劃分為5個區域:程式計數器(
java物件建立過程及初始化順序
Java虛擬機器建立一個物件都包含以下步驟: (1)給物件分配記憶體。 (2)將物件的例項變數自動初始化為其變數型別的預設值。 (3)初始化物件,給例項變數賦予正確的初始值。 對於以上第三個步驟,Java虛擬機器可採用3種方式來初始化物件,到底採用何
圖解JAVA物件的建立過程
前面幾篇博文分別介紹了JAVA的Class檔案格式、JVM的類載入機制和JVM的記憶體模型,這裡就索性把java物件的建立過程一併說完,這樣java物件的整個建立過程就基本上說明白了(當然你要有基礎才能真正看明白)。經常有人問我為什麼這麼喜歡鑽研底層的東西,首先,因為我以前的
Java程式執行和物件建立過程簡述
Java中一個物件建立分為兩個步驟: 載入類,建立物件。 載入類是將所寫的程式.java檔案編譯生成的.class檔案載入到記憶體中,保證了物件建立的預置環境。類載入完畢後才可以建立該類的物件。 第一步:載入類 1. 當開始執行一個類,虛擬機器首先試圖訪問指定啟
《物件建立過程中 例項化的順序》摘自《Thinking in JAVA》
最近一直在看《Thinking In JAVA》,裡面一些知識點自己平日裡還真沒有注意過: 譬如這部分:在例項化物件的過程,物件的各部分的初始化順序: 總結一下物件的建立過程,假如有個名為Dog的類: 1.即使沒有顯示的使用Static關鍵字,構造器實際上也是靜態方法,
【深入理解Java虛擬機器】Java記憶體區域模型、物件建立過程、常見OOM
本文內容來源於《深入理解Java虛擬機器》一書,非常推薦大家去看一下這本書。最近開始看這本書,打算再開一個相關係列,來總結一下這本書中的重要知識點。呃呃呃,說好的那個圖片請求框架呢~ 不要急哈,因為這個請求框架設計的內容還是比較廣的,目前業餘時間正在編寫當中,弄好了之後就會
Java物件建立的過程?
Java建立物件的過程? 判斷是否被載入到記憶體 Jvm遇到一條new指令時,會檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,檢查其是否被載入,解析和初始化,如果沒意義,把類載入到記憶體 為物件分配記憶體空間 分配記憶體有兩種
Java物件建立的具體過程
Java是一門面向物件的程式語言,在Java程式執行過程中無時無刻都有物件被創建出來。在語言層面上,建立物件(例如克隆、反序列化)通常僅僅是一個new關鍵字而已,而在虛擬機器中,物件(文中討論的物件限於普通Java物件,不包括陣列和Class物件等)的建立又是怎樣一個過程呢
Java中類載入過程和物件建立過程
類載入過程: 1, JVM會先去方法區中找有沒有相應類的.class存在。如果有,就直接使用;如果沒有,則把相關類的.class載入到方法區 2, 在.class載入到方法區時,會分為兩部分載入:先載入非靜態內容,再載入靜態內容 3, 載入非靜態內容:把.class中的所有
Java記憶體區域模型、物件建立過程、常見OOM
本文內容來源於《深入理解Java虛擬機器》一書,非常推薦大家去看一下這本書。最近開始看這本書,打算再開一個相關係列,來總結一下這本書中的重要知識點。呃呃呃,說好的那個圖片請求框架呢~ 不要急哈,因為這個請求框架設計的內容還是比較廣的,目前業餘時間正在編寫當中,弄好了之
JAVA物件建立的過程
JVM物件建立的過程 對於java程式設計師來說,我們無時無刻不在建立和使用物件。使用new關鍵字即可快速建立一個物件,其實在new的背後,JVM為我們完成了很多事情。 JVM的位元組碼直譯器在讀取到NEW的指令時,會先去常量區定位對應類的符
java物件建立(記憶體模型)過程詳解
概述 java物件建立分為兩個過程:宣告物件引用和建立物件實體。類資訊、物件引用、物件實體均在記憶體的不同區域。 記憶體結構 每一個java應用程式均會唯一的對應一個jvm例項,而這個jvm例
深入學習Java物件建立的過程:類的初始化與例項化
在Java中,一個物件在可以被使用之前必須要被正確地初始化,這一點是Java規範規定的。在例項化一個物件時,JVM首先會檢查相關型別是否已經載入並初始化,如果沒有,則JVM立即進行載入並呼叫類構造器完成類的初始化。在類初始化過程中或初始化完畢後,根據具體情況才會去對類進行例項化。本文試圖對JVM執行類初始
物件建立過程
物件的建立過程: 1.指令引數能否在常量池中定位到一個類的符號引用; 2.檢查這個符號引用代表的類是否已經被載入、解析和初始化,如果沒有必須先執行類載入過程; 3.類載入檢查通過後,虛擬機器分配記憶體(物件的記憶體大小在類載入完成後就可以確定)。記憶體分配有“指標碰撞”和“空閒列表
java物件建立流程
物件建立流程 推薦部落格 建立觸發 關於物件的建立一般是從new指令(我說的是JVM的層面)開始的。 虛擬機器遇到一條new指令時,會先去檢查這個指令的引數能否在方法區中的常量池中檢索到一個類的符號應用,並且檢查這個符號引用代表的類是否已被載入、解析、初始化
AOP Proxy 物件建立過程
由《Spring的IOC的原始碼解析(三)》繼續分析!首先介紹一下容器名稱空間控制代碼 ContextNamespaceHandler位置:spring-context-*.jar的META-INF/spring-handlersContextNamespaceHandler
MyBatis執行原理(二)SqlSession物件建立過程分析
在上一篇博文中分析了SqlSessionFactory物件建立的過程,有了SqlSessionFactory物件工廠就可以建立SqlSession了,下面就來具體分析一下SqlSession物件建立
Java物件建立模式
建立Java物件時,對於可為空的屬性,建立物件的時候有3種模式:重疊構造器模式、JavaBeans模式、Builder模式(推薦)、Stream模式(推薦)。
java中用new建立一個物件的過程解析
java中用new建立一個物件的過程解析 對於用new 建立一個物件,我們需要弄清楚它的過程: 引用和建立一個物件的格式是: 類名 變數名; 變數名=new 類名(引數列表); 比如 Vehicle veh1=new Vehicle(); 這個語句具體的執行過