深入了解java虚拟机(JVM) 第四章 对象的创建
一、對象的創建過程
? ? 對象的創建過程大致可以分為六步,其中對象的分配尤為重要:
? ? ? ? ?
二、對象分配內存
? ? ? ?一般來說對象分配內存有兩種方式:
? ? ? ? 第一種是指針碰撞,這是一種比較理想的方式:如果Java堆是絕對規整的:一邊是用過的內存,一邊是空閑的內存,中間一個指針作為邊界指示器;分配內存只需向空閑那邊移動指針,這種分配方式稱為"指針碰撞"(Bump the Pointer);
? ? ? ?第二中方式是空閑列表,這中方式沒有指針碰撞那么理想,但是也有他自身的優勢:如果Java堆不是規整的:用過的和空閑的內存相互交錯; 需要維護一個列表,記錄哪些內存可用;分配內存時查表找到一個足夠大的內存,并更新列表,這種分配方式稱為"空閑列表"(Free List);
? ? ? 這兩種方式各有各的優勢,具體選用方式,需要根據垃圾收集器來進行選擇,主要是根據垃圾回收器有無壓縮來選擇。
三、線程安全問題
? ? ? 在進行并發操作時,上面兩種方式分配內存的操作都不是線程安全的,所以考慮到解決這種線程安全問題:
? ? ? 第一種:加鎖,這種方式是開發過程中最容易使用的方式,也是最簡單的方式,但是這種方式的缺點就是執行效率太低。
? ? ? 第二種:本地線程分配緩沖區(TLAB):把分配內存的動作按照線程劃分在不同的空間中進行:在每個線程在Java堆預先分配一小塊內存,稱為本地線程分配緩沖區(Thread Local Allocation Buffer,TLAB);哪個線程需要分配內存就從哪個線程的TLAB上分配。
四、對象的結構
? ? ?對象的結構分為三部分:
? ? ? 第一部分:Header(對象頭),對象頭又有兩給部塊組成
? ? ? ?1.自身運行時數據(Mark word),這部分數據是對象主要存儲的數據,主要有:
? ? ? ? ? ? ? ? a.哈希值:這個值是通過一個native方法獲取
? ? ? ? ? ? ? ? ? b.GC分代年齡:這個是垃圾回收算法使用
? ? ? ? ? ?以上介紹兩種作用是太相同的,至于剩下的:c.鎖狀態標志、d.線程持有的鎖、e.偏向線程ID、f.偏向時間戳都是作用于線程優化的
? ? ? ?2.類型指針:對象指向類對象本身數據的指針
? ? ? 第二部分:實例數據(InstanceData):
? ? ? ? ?實例數據部分是對象真正存儲的有效信息,也既是我們在程序代碼里面所定義的各種類型的字段內容,無論是從父類繼承下來的,還是在子類中定義的都需要記錄下來。 這部分的存儲順序會受到虛擬機分配策略參數(FieldsAllocationStyle)和字段在Java源碼中定義順序的影響。HotSpot虛擬機 默認的分配策略為longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),從分配策略中可以看出,相同寬度的字段總是被分配到一起。在滿足這個前提條件的情況下,在父類中定義的變量會出現在子類之前。如果 CompactFields參數值為true(默認為true),那子類之中較窄的變量也可能會插入到父類變量的空隙之中。
? ? 第三部分:對齊填充(Padding)
? ? ? ?第三部分對齊填充并不是必然存在的,也沒有特別的含義,它僅僅起著占位符的作用。由于HotSpot VM的自動內存管理系統要求對象起始地址必須是8字節的整數倍,換句話說就是對象的大小必須是8字節的整數倍。對象頭正好是8字節的倍數(1倍或者2倍),因此當對象實例數據部分沒有對齊的話,就需要通過對齊填充來補全。
五、對象的訪問定位
? ? ?對立對象是為了使用對象.Java程序需要通過在棧上的reference數據操作堆上的具體對象. 由于reference類型在Java虛擬機規范中只規定了一個指向對象的引用,并沒有定義這個引用應該通過何種方式去定位,訪問堆中的對象的具體位置,所以對象的訪問方式取決于虛擬機的實現而定的.。簡單來說?棧指向堆中只會指向地址,至于地址存儲的是否對象,我們是無法知道的,
? ? 解決這一問題目前有兩種方式:
? ? ? 第一種:句柄指針:棧指向堆中的句柄池,句柄池中有實例對象的地址,通過句柄池指向對象
? ? ? 優點:棧地址永遠不會改變,或者說引用地址不會改變
? ? ? 第二張:直接指針:reference中存儲直接對象的地址,但是必須考慮放置訪問類型數據的相關信息
? ? ?優點:效率快,節省了一次指針定位的時間開銷
?
轉載于:https://www.cnblogs.com/daijiting/p/9960783.html
總結
以上是生活随笔為你收集整理的深入了解java虚拟机(JVM) 第四章 对象的创建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P5068 [Ynoi2015]我回来了
- 下一篇: python-入门