电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談java對象結構 對象頭 Markword

瀏覽:140日期:2022-05-25 17:14:34

概述

對象實例由對象頭、實例數據組成,其中對象頭包括markword和類型指針,如果是數組,還包括數組長度;

| 類型 | 32位JVM | 64位JVM|| ------ ---- | ------------| --------- || markword | 32bit | 64bit || 類型指針 | 32bit |64bit ,開啟指針壓縮時為32bit || 數組長度 | 32bit |32bit |

淺談java對象結構 對象頭 Markword

header.png

淺談java對象結構 對象頭 Markword

compressed_header.png

可以看到

開啟指針壓縮時,markword占用8bytes,類型指針占用8bytes,共占用16bytes;

未開啟指針壓縮時,markword占用8bytes,類型指針占用4bytes,但由于java內存地址按照8bytes對齊,長度必須是8的倍數,因此會從12bytes補全到16bytes;

數組長度為4bytes,同樣會進行對齊,補足到8bytes;

另外從上面的截圖可以看到,開啟指針壓縮之后,對象類型指針為0xf800c005,但實際的類型指針為0x7c0060028;那么指針是如何壓縮的呢?

實際上由于java地址一定是8的倍數,因此將0xf800c005*8即可得到實際的指針0x7c0060028,關于指針壓縮的更多知識可參考官方文檔。

markword結構

markword的結構,定義在markOop.hpp文件:

32 bits: -------- hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object) JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object) size:32 ------------------------------------------>| (CMS free block) PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object) 64 bits: -------- unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object) JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object) PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object) size:64 ----------------------------------------------------->| (CMS free block) unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object) JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object) narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object) unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block) [ptr | 00] locked ptr points to real header on stack [header | 0 | 01] unlocked regular object header [ptr | 10] monitor inflated lock (header is wapped out) [ptr | 11] marked used by markSweep to mark an object

由于目前基本都在使用64位JVM,此處不再對32位的結構進行詳細說明:

偏向鎖標識位 鎖標識位 鎖狀態 存儲內容 0 01 未鎖定 hash code(31),年齡(4) 1 01 偏向鎖 線程ID(54),時間戳(2),年齡(4) 無 00 輕量級鎖 棧中鎖記錄的指針(64) 無 10 重量級鎖 monitor的指針(64) 無 11 GC標記 空,不需要記錄信息

此處,有幾點要注意:

如果對象沒有重寫hashcode方法,那么默認是調用os::random產生hashcode,可以通過System.identityHashCode獲取;os::random產生hashcode的規則為:next_rand = (16807seed) mod (2*31-1),因此可以使用31位存儲;另外一旦生成了hashcode,JVM會將其記錄在markword中;

GC年齡采用4位bit存儲,最大為15,例如MaxTenuringThreshold參數默認值就是15;

當處于輕量級鎖、重量級鎖時,記錄的對象指針,根據JVM的說明,此時認為指針仍然是64位,最低兩位假定為0;當處于偏向鎖時,記錄的為獲得偏向鎖的線程指針,該指針也是64位;

We assume that stack/thread pointers have the lowest two bits cleared.ObjectMonitor* monitor() const { assert(has_monitor(), 'check'); // Use xor instead of &~ to provide one extra tag-bit check. return (ObjectMonitor*) (value() ^ monitor_value);//monitor_value=2,value最右兩位為10,因此異或之后最右兩位為0 }JavaThread* biased_locker() const { assert(has_bias_pattern(), 'should not call this otherwise'); return (JavaThread*) ((intptr_t) (mask_bits(value(), ~(biased_lock_mask_in_place | age_mask_in_place | epoch_mask_in_place))));//~(biased_lock_mask_in_place | age_mask_in_place | epoch_mask_in_place)為11111111111111111111110010000000,計算后的結果中,低10位全部為0; }

由于java中內存地址都是8的倍數,因此可以理解為最低3bit為0,因此假設輕量級和重量級鎖的最低2位為0是成立的;但為什么偏向鎖的最低10位都是0?查看markOop.hpp文件,發現有這么一句話:

// Alignment of JavaThread pointers encoded in object header required by biased locking enum { biased_lock_alignment = 2 << (epoch_shift + epoch_bits)//epoch_shift+epoch_bits=10 };

thread.hpp中重載了operator new:

void* operator new(size_t size) { return allocate(size, true); }// ======= Thread ========// Support for forcing alignment of thread objects for biased lockingvoid* Thread::allocate(size_t size, bool throw_excpt, MEMFLAGS flags) { if (UseBiasedLocking) { const int alignment = markOopDesc::biased_lock_alignment;//10 size_t aligned_size = size + (alignment - sizeof(intptr_t)); void* real_malloc_addr = throw_excpt? AllocateHeap(aligned_size, flags, CURRENT_PC) : os::malloc(aligned_size, flags, CURRENT_PC); void* aligned_addr = (void*) align_size_up((intptr_t) real_malloc_addr, alignment); assert(((uintptr_t) aligned_addr + (uintptr_t) size) <= ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size), 'JavaThread alignment code overflowed allocated storage'); if (TraceBiasedLocking) { if (aligned_addr != real_malloc_addr) tty->print_cr('Aligned thread ' INTPTR_FORMAT ' to ' INTPTR_FORMAT, real_malloc_addr, aligned_addr); } ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr; return aligned_addr; } else { return throw_excpt? AllocateHeap(size, flags, CURRENT_PC) : os::malloc(size, flags, CURRENT_PC); }}

如果開啟了偏移鎖,在創建線程時,線程地址會進行對齊處理,保證低10位為0

實例數據

實例數據中主要包括對象的各種成員變量,包括基本類型和引用類型;static類型的變量會放到java/lang/Class中,而不會放到實例數據中;

對于引用類型的成員(包括string),存儲的指針;對于基本類型,直接存儲內容;通常會將基本類型存儲在一起,引用類型存儲在一起;

例如類Test的成員定義如下:

private static Test t1=new Test(); private Test t2; private int a=5; private Integer b=7; private String c='112'; private BigDecimal d=new BigDecimal('5'); private long e=9l;

淺談java對象結構 對象頭 Markword

body.png

可以看到long e、int a為基本類型,存儲在一起;其它的引用類型存儲在一起;int占用4bytes,不足8bytes,自動補足到8bytes;

補充知識:java的對象物理結構,以及對象頭中MarkWord與鎖的關系

java 對象頭

我們都知道,Java對象存儲在堆(Heap)內存。那么一個Java對象到底包含什么呢?概括起來分為對象頭、對象體和對齊字節。

如下圖所示:

淺談java對象結構 對象頭 Markword

對象的幾個部分的作用:

1.對象頭中的Mark Word(標記字)主要用來表示對象的線程鎖狀態,另外還可以用來配合GC、存放該對象的hashCode;

2.Klass Word是一個指向方法區中Class信息的指針,意味著該對象可隨時知道自己是哪個Class的實例;

3.數組長度也是占用64位(8字節)的空間,這是可選的,只有當本對象是一個數組對象時才會有這個部分;

4.對象體是用于保存對象屬性和值的主體部分,占用內存空間取決于對象的屬性數量和類型;

5.對齊字是為了減少堆內存的碎片空間(不一定準確)。

了解了對象的總體結構,接下來深入地了解對象頭的三個部分。

一、Mark Word(標記字)

淺談java對象結構 對象頭 Markword

以上是Java對象處于5種不同狀態時,Mark Word中64個位的表現形式,上面每一行代表對象處于某種狀態時的樣子。其中各部分的含義如下:

lock:2位的鎖狀態標記位,由于希望用盡可能少的二進制位表示盡可能多的信息,所以設置了lock標記。該標記的值不同,整個Mark Word表示的含義不同。biased_lock和lock一起,表達的鎖狀態含義如下:

淺談java對象結構 對象頭 Markword

biased_lock:對象是否啟用偏向鎖標記,只占1個二進制位。為1時表示對象啟用偏向鎖,為0時表示對象沒有偏向鎖。lock和biased_lock共同表示對象處于什么鎖狀態。

age:4位的Java對象年齡。在GC中,如果對象在Survivor區復制一次,年齡增加1。當對象達到設定的閾值時,將會晉升到老年代。默認情況下,并行GC的年齡閾值為15,并發GC的年齡閾值為6。由于age只有4位,所以最大值為15,這就是-XX:MaxTenuringThreshold選項最大值為15的原因。

identity_hashcode:31位的對象標識hashCode,采用延遲加載技術。調用方法System.identityHashCode()計算,并會將結果寫到該對象頭中。當對象加鎖后(偏向、輕量級、重量級),MarkWord的字節沒有足夠的空間保存hashCode,因此該值會移動到管程Monitor中。

thread:持有偏向鎖的線程ID。

epoch:偏向鎖的時間戳。

ptr_to_lock_record:輕量級鎖狀態下,指向棧中鎖記錄的指針。

ptr_to_heavyweight_monitor:重量級鎖狀態下,指向對象監視器Monitor的指針。

淺談java對象結構 對象頭 Markword

二、Klass Word(類指針)

這一部分用于存儲對象的類型指針,該指針指向它的類元數據,JVM通過這個指針確定對象是哪個類的實例。該指針的位長度為JVM的一個字大小,即32位的JVM為32位,64位的JVM為64位。

如果應用的對象過多,使用64位的指針將浪費大量內存,統計而言,64位的JVM將會比32位的JVM多耗費50%的內存。為了節約內存可以使用選項+UseCompressedOops開啟指針壓縮,其中,oop即ordinary object pointer普通對象指針。

開啟該選項后,下列指針將壓縮至32位:

每個Class的屬性指針(即靜態變量)

每個對象的屬性指針(即對象變量)

普通對象數組的每個元素指針

當然,也不是所有的指針都會壓縮,一些特殊類型的指針JVM不會優化,比如指向PermGen的Class對象指針(JDK8中指向元空間的Class對象指針)、本地變量、堆棧元素、入參、返回值和NULL指針等。

三、數組長度

如果對象是一個數組,那么對象頭還需要有額外的空間用于存儲數組的長度,這部分數據的長度也隨著JVM架構的不同而不同:32位的JVM上,長度為32位;64位JVM則為64位。

64位JVM如果開啟+UseCompressedOops選項,該區域長度也將由64位壓縮至32位。

以上這篇淺談java對象結構 對象頭 Markword就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: word
相關文章:
主站蜘蛛池模板: 重庆轻质隔墙板-重庆安吉升科技有限公司 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] | 电子书导航网_电子书之家_电子书大全_最新电子书分享发布平台 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 台式恒温摇床价格_大容量恒温摇床厂家-上海量壹科学仪器有限公司 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 空压机网_《压缩机》杂志| 广州昊至泉水上乐园设备有限公司| 移动机器人产业联盟官网| 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 酒瓶_酒杯_玻璃瓶生产厂家_徐州明政玻璃制品有限公司 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 公交驾校-北京公交驾校欢迎您! 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 超声骨密度仪-骨密度检测仪-经颅多普勒-tcd仪_南京科进实业有限公司 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 |