国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

深入理解JVM(二)——揭開HotSpot對象創(chuàng)建的奧秘

2019-11-10 16:47:47
字體:
供稿:網(wǎng)友

1)Hotspot是什么:http://www.cnblogs.com/charlesblc/p/5993804.html

在2008年和2009年,Oracle公司分別收購了BEA公司和Sun公司,這樣Oracle就同時擁有了兩款優(yōu)秀的java虛擬機:JRockit VM和HotSpot VM。Oracle公司宣布在不久的將來(大約應(yīng)在發(fā)布JDK 8的時候)會完成這兩款虛擬機的整合工作,使之優(yōu)勢互補。整合的方式大致上是在HotSpot的基礎(chǔ)上,移植JRockit的優(yōu)秀特性,譬如使用JRockit的垃圾回收器與MissionControl服務(wù),使用HotSpot的JIT解釋與編譯 混合混合的運行時系統(tǒng)。
HotSpot VM的熱點代碼探測能力可以通過執(zhí)行計數(shù)器找出最具有編譯價值的代碼,然后通知JIT編譯器以方法為單位進行編譯。如果一個方法被頻繁調(diào)用,或方法中有效循環(huán)次數(shù)很多,將會分別觸發(fā)標(biāo)準(zhǔn)編譯和OSR(棧上替換)編譯動作。通過編譯器與解釋器恰當(dāng)?shù)貐f(xié)同工作,可以在最優(yōu)化的程序響應(yīng)時間與最佳執(zhí)行性能中取得平衡,而且無須等待本地代碼輸出才能執(zhí)行程序,即時編譯的時間壓力也相對減小,這樣有助于引入更多的代碼優(yōu)化技術(shù),輸出質(zhì)量更高的本地代碼。
編譯器是把源程序的每一條語句都編譯成機器語言,并保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;而解釋器則是只在執(zhí)行程序時,才一條一條的解釋成機器語言給計算機來執(zhí)行,所以運行速度是不如編譯后的程序運行的快的.

動態(tài)編譯(compile during run-time),英文稱Dynamic compilation;Just In Time也是這個意思。

      HotSpot對bytecode的編譯不是在程序運行前編譯的,而是在程序運行過程中編譯的。

 java -version

   Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)

   mixed mode 解釋與編譯 混合的執(zhí)行模式 默認使用這種模式

 

   java -Xint -version

   Java HotSpot(TM) Client VM (build 14.3-b01, interPReted mode, sharing)

   interpreted  純解釋模式 禁用JIT編譯

 

   java -Xcomp -version

   Java HotSpot(TM) Client VM (build 14.3-b01, compiled mode, sharing)

   compiled  純編譯模式(如果方法無法編譯,則回退到解釋模式執(zhí)行無法編譯的方法)

http://blog.csdn.net/u010425776/article/details/51190801

2)對象的創(chuàng)建過程

當(dāng)虛擬機遇到一條含有new的指令時,會進行一系列對象創(chuàng)建的操作:

檢查常量池中是否有即將要創(chuàng)建的這個對象所屬的類的符號引用;

若常量池中沒有這個類的符號引用,說明這個類還沒有被定義!拋出ClassNotFoundException;若常量池中有這個類的符號引用,則進行下一步工作;

進而檢查這個符號引用所代表的類是否已經(jīng)被JVM加載;

若該類還沒有被加載,就找該類的class文件,并加載進方法區(qū);若該類已經(jīng)被JVM加載,則準(zhǔn)備為對象分配內(nèi)存;

根據(jù)方法區(qū)中該類的信息確定該類所需的內(nèi)存大小; 一個對象所需的內(nèi)存大小是在這個對象所屬類被定義完就能確定的!且一個類所生產(chǎn)的所有對象的內(nèi)存大小是一樣的!JVM在一個類被加載進方法區(qū)的時候就知道該類生產(chǎn)的每一個對象所需要的內(nèi)存大小。

從堆中劃分一塊對應(yīng)大小的內(nèi)存空間給新的對象; 分配堆中內(nèi)存有兩種方式:

指針碰撞 如果JVM的垃圾收集器采用復(fù)制算法或標(biāo)記-整理算法,那么堆中空閑內(nèi)存是完整的區(qū)域,并且空閑內(nèi)存和已使用內(nèi)存之間由一個指針標(biāo)記。那么當(dāng)為一個對象分配內(nèi)存時,只需移動指針即可。因此,這種在完整空閑區(qū)域上通過移動指針來分配內(nèi)存的方式就叫做“指針碰撞”。空閑列表 如果JVM的垃圾收集器采用標(biāo)記-清除算法,那么堆中空閑區(qū)域和已使用區(qū)域交錯,因此需要用一張“空閑列表”來記錄堆中哪些區(qū)域是空閑區(qū)域,從而在創(chuàng)建對象的時候根據(jù)這張“空閑列表”找到空閑區(qū)域,并分配內(nèi)存。 綜上所述:JVM究竟采用哪種內(nèi)存分配方法,取決于它使用了何種垃圾收集器。

為對象中的成員變量賦上初始值(默認初始化);

設(shè)置對象頭中的信息;

調(diào)用對象的構(gòu)造函數(shù)進行初始化 此時,整個對象的創(chuàng)建過程就完成了。

對象的內(nèi)存模型

一個對象從邏輯角度看,它由成員變量和成員函數(shù)構(gòu)成,從物理角度來看,對象是存儲在堆中的一串二進制數(shù),這串二進制數(shù)的組織結(jié)構(gòu)如下。

對象在內(nèi)存中分為三個部分:

對象頭實例數(shù)據(jù)對齊補充

1. 對象頭

對象頭中記錄了對象在運行過程中所需要使用的一些數(shù)據(jù):哈希碼、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID、偏向時間戳等。

此外,對象頭中可能還包含類型指針。通過該指針能確定這個對象所屬哪個類。

此外,如果對象是一個數(shù)組,那么對象頭中還要包含數(shù)組長度。

2. 實例數(shù)據(jù)

實力數(shù)據(jù)部分就是成員變量的值,其中包含父類的成員變量和本類的成員變量。

3. 對齊補充

用于確保對象的總長度為8字節(jié)的整數(shù)倍。 HotSpot要求對象的總長度必須是8字節(jié)的整數(shù)倍。由于對象頭一定是8字節(jié)的整數(shù)倍,但實例數(shù)據(jù)部分的長度是任意的,因此需要對齊補充字段確保整個對象的總長度為8的整數(shù)倍。

訪問對象的過程

我們知道,引用類型的變量中存放的是一個地址,那么根據(jù)地址類型的不同,對象有不同的訪問方式:

句柄訪問方式 堆中需要有一塊叫做“句柄池”的內(nèi)存空間,用于存放所有對象的地址和所有對象所屬類的類信息。 引用類型的變量存放的是該對象在句柄池中的地址。訪問對象時,首先需要通過引用類型的變量找到該對象的句柄,然后根據(jù)句柄中對象的地址再訪問對象。

直接指針訪問方式 引用類型的變量直接存放對象的地址,從而不需要句柄池,通過引用能夠直接訪問對象。 但對象所在的內(nèi)存空間中需要額外的策略存儲對象所屬的類信息的地址。

比較

HotSpot采用直接指針方式訪問對象,因為它只需一次尋址操作,從而性能比句柄訪問方式快一倍。但它需要額外的策略存儲對象在方法區(qū)中類信息的地址。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 新河县| 十堰市| 渭南市| 平罗县| 桓仁| 大竹县| 永嘉县| 临沂市| 安仁县| 得荣县| 西安市| 衡阳市| 福清市| 平谷区| 石林| 夹江县| 三台县| 绥宁县| 南城县| 清苑县| 八宿县| 阳高县| 新沂市| 台湾省| 扶风县| 麻栗坡县| 威海市| 三亚市| 南郑县| 清新县| 巴南区| 余姚市| 屏东市| 长汀县| 新民市| 阳高县| 醴陵市| 乌鲁木齐县| 宜城市| 景泰县| 嘉定区|