国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java基礎之創(chuàng )建虛擬機對象的過(guò)程詳細總結

發(fā)布時(shí)間:2021-07-05 18:40 來(lái)源:腳本之家 閱讀:0 作者:IT__learning 欄目: 開(kāi)發(fā)技術(shù)

目錄

    一、對象的創(chuàng )建


    1.1 new 類(lèi)名

    虛擬機遇到一條new指令時(shí),首先檢查這個(gè)指令的參數是否能在常量池中定位到一個(gè)類(lèi)的符號引用,并檢查這個(gè)符號引用代表的類(lèi)是否已經(jīng)被加載、解析和初始化過(guò)。如果沒(méi)有,先執行相應的類(lèi)加載過(guò)程。

    1.2 分配內存

    虛擬機為新生對象分配內存。對象所需內存大小在類(lèi)加載完成后就可以確定,為對象分配內存等同于把一塊確定大小的內存從Java堆中劃分出來(lái)。

    (1)內存分配的方式有兩種:

    指針碰撞: java堆如果規整,一邊是用過(guò)的內存,一邊是空閑的內存,中間一個(gè)指針作為邊界指示器; 分配內存只需向空閑那邊移動(dòng)指針空出與對象大小相等的空間;

    空閑列表: 如果不規整,即用過(guò)的和空閑的內存相互交錯;則虛擬機需要維護一個(gè)列表,記錄哪些內存可用;分配內存時(shí)查表找到一個(gè)足夠大的內存,并更新列表記錄。
    選擇哪種分配方式是根據這個(gè)虛擬機所采用的垃圾收集器是否帶有壓縮整理功能決定的:如果虛擬機的虛擬器帶壓縮整理功能,則系統采用指針碰撞的內存分配算法;否則采用空閑列表的算法。

    (2)線(xiàn)程安全問(wèn)題

    并發(fā)時(shí),上面兩種方式分配內存的操作都不是線(xiàn)程安全的,有兩種解決方案:
    同步處理
    JVM采用CAS(Compare and Swap)機制加上失敗重試的方式,保證更新操作的原子性;
    CAS:有3個(gè)操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時(shí),將內存值V修改為B,否則什么都不做;
    本地線(xiàn)程分配緩沖區(TLAB)
    把分配內存的動(dòng)作按照線(xiàn)程劃分在不同的空間中進(jìn)行:每個(gè)線(xiàn)程在Java堆預先分配一小塊內存,稱(chēng)為本地線(xiàn)程分配緩沖區(Thread Local Allocation Buffer,TLAB);哪個(gè)線(xiàn)程需要分配內存就從哪個(gè)線(xiàn)程的TLAB上分配;只有TLAB用完需要分配新的TLAB時(shí),才需要同步處理。
    JVM通過(guò)"-XX:+/-UseTLAB"指定是否使用TLAB。

    1.3 初始化零值

    內存分配完之后,虛擬機需要將分配到的內存空間都初始化為零值。如果用TLAB,則在TLAB分配時(shí)進(jìn)行。這保證了程序中對象(及實(shí)例變量)不顯式初始賦零值,程序也能訪(fǎng)問(wèn)到零值。

    1.4 設置對象信息

    虛擬機對對象進(jìn)行必要的設置,例如這個(gè)對象是哪個(gè)類(lèi)的實(shí)例、 如何才能找到類(lèi)的元數據信息、 對象的哈希碼、 對象的GC分代年齡等信息。這些信息存放在對象的對象頭(Object Header)之中。

    1.5 構造對象

    執行init方法,即按照程序員的意愿進(jìn)行初始化。至此真正可用的對象才算完全被構造出來(lái)。

    二、對象的內存布局

    在HotSpot虛擬機中,對象在內存中存儲的布局可以分為3塊區域:對象頭(Header)、實(shí)例數據(InstanceData)和對齊填充(Padding)。

    2.1 對象頭

    HotSpot虛擬機的對象頭包含兩部分:

    (1)第一部分用于存儲對象自身運行時(shí)數據,這部分數據的長(cháng)度在32位和64位的虛擬機中分別為32bit和64bit,官方稱(chēng)它為“Mark Word”。

    (2)另外一部分是類(lèi)型指針,即對象指向它的類(lèi)元數據的指針,虛擬機通過(guò)這個(gè)指針來(lái)確定這個(gè)對象是那個(gè)類(lèi)的實(shí)例。
    并不是所有的虛擬機實(shí)現都必須在對象數據上保留類(lèi)型指針,即查找對象的元數據信息并不一定要經(jīng)過(guò)對象本身。

    另外,如果對象是一個(gè)Java數組,那在對象頭中還必須有一塊用于記錄數組長(cháng)度的數據,因為虛擬機可以通過(guò)普通Java對象的元數據信息確定Java對象的大小,但是從數組的元數據中卻無(wú)法確定數組的大小。

    2.2 實(shí)例數據

    實(shí)例數據部分是對象真正存儲的有效信息,也是在程序代碼中所定義的各種類(lèi)型的字段內容。無(wú)論是從父類(lèi)繼承下來(lái)的,還是在子類(lèi)中定義的,都需要記錄起來(lái)。這部分的存儲順序會(huì )受到虛擬機分配策略參數(FiedsAllocationStyle)和字段在Java源碼中定義順序的影響。

    HotSpot虛擬機默認的分配策略為:longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers)。從分配策略中可以看出,相同寬度的字段總是被分配到一起。在滿(mǎn)足這個(gè)前提條件的情況下,在父類(lèi)中定義的變量會(huì )出現在子類(lèi)之前。如果CompactFieds參數值為true(默認為true),那么子類(lèi)中較窄的變量也可能會(huì )插入到父類(lèi)變量的空隙之中。

    2.3 對齊填充

    對齊填充并不是必然存在的,也沒(méi)有特別的含義,他僅僅起占位符的作用。由于HotSpot VM的自動(dòng)內存管理系統要求對象起始地址必須是8字節的整數倍,換句話(huà)說(shuō),就是對象的大小必須是8字節的整數倍,而對象頭部分正好是8字節的倍數,因此,當對象實(shí)例部分沒(méi)有對齊時(shí),就需要通過(guò)對齊填充來(lái)補全。

    三、對象的訪(fǎng)問(wèn)定位

    建立對象是為了使用對象,Java程序通過(guò)棧上的reference數據來(lái)操作堆上的具體對象。
    reference類(lèi)型在Java虛擬機規范中之規定了一個(gè)指向對象的引用,但沒(méi)有定義這個(gè)引用應該通過(guò)何種方式去定位訪(fǎng)問(wèn)隊中的對象的具體位置,因此對象的訪(fǎng)問(wèn)方式也是由虛擬機實(shí)現而定的。目前主流方式是使用句柄和直接指針兩種。

    3.1 使用句柄

    如果以句柄方式訪(fǎng)問(wèn),Java堆中將會(huì )劃分出一塊內存作為句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實(shí)例數據與類(lèi)型數據各自的具體地址信息。


    3.2 指針?lè )绞?/strong>

    如果以指針?lè )绞皆L(fǎng)問(wèn),那么Java堆對象的布局中就必須考慮如何放置訪(fǎng)問(wèn)類(lèi)型數據的相關(guān)信息,而reference中存儲的直接就是對象地址,如果只是訪(fǎng)問(wèn)對象本身,就會(huì )少一次間接訪(fǎng)問(wèn)的開(kāi)銷(xiāo)。


    四、兩種方式的比較

    句柄訪(fǎng)問(wèn)最大好處就是reference中存儲的是穩定的句柄地址,在對象被移動(dòng)時(shí)只會(huì )改變句柄中的實(shí)例數據指針,而reference本身不需要修改。
    指針訪(fǎng)問(wèn)方式最大好處就是速度更快,節省了一次指針定位的時(shí)間開(kāi)銷(xiāo),由于對于下部分的訪(fǎng)問(wèn)在Java中非常頻繁,因此此類(lèi)開(kāi)銷(xiāo)積少成多后也是一項非??捎^(guān)的執行成本。

    到此這篇關(guān)于Java基礎之創(chuàng )建虛擬機對象的過(guò)程詳細總結的文章就介紹到這了,更多相關(guān)虛擬機中對象的創(chuàng )建過(guò)程內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

    免费女人18毛片A级毛片视频| 国际精品网| 日韩人妻无码精品二专区| 男女啪啪高清无遮挡免费| 丝袜人妻一区二区三区网站 | 久久AAAA片一区二区,|