在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析JVM之對象創(chuàng)建流程及對象內存布局

jf_78858299 ? 來源:北洋洋洋 ? 作者:北洋 ? 2023-02-02 11:16 ? 次閱讀

對象創(chuàng)建流程

JAVA虛擬機碰到new字節(jié)碼指令時,首先會去常量池中查找是否有對應的類名(也就是去查找是否有對應的符號引用),然后去檢查這個符號引用代表的類是否已經被加載,解析和初始化過。如果沒有會先進行類加載過程。

當類加載后,虛擬機將會為其分配內存,為其分配的內存大小是可知的,下面的內存布局將會講解為什么是可知的。

分配內存

分配內存這時候有兩種情況:

1.假如堆里面的內存是整齊的,用過的在一邊,沒有用過的內存放在另外一邊(后期配圖),這個時候中間有個指針來作為兩邊內存的界限,當內存分配時,指針移動對象內存大小對應的距離即可,這種叫==指針碰撞==。

2.堆里面的內存空間不是規(guī)整的,這就需要記錄下來哪些內存是可用的,哪些內存是已經被占用了的。這種方式就叫做==空閑列表==:將內存中空閑內存塊記錄到列表里面。當分配對象時,直接從空閑列表里面進行取出對應大小的內存塊即可。

這兩種情況又是根據采用的垃圾收集器是否帶有==空間壓縮整理的能力==劃分,如果垃圾收集器已經具備了空間壓縮整理的能力那么他的內存空間就是==被整理好的==,直接使用==指針碰撞==就好;但是如果是基于清除算法決定的垃圾回收器時,就只能用復雜的空閑列表來分配內存。

并發(fā)解決方法

但是如果發(fā)生并發(fā)的話,可能在分配一個對象空間的時候又碰到另外一個線程也在分配空間,這個時候就會出現(xiàn)問題,解決方式有兩種:

1.通過CAS進行同步處理,基于失敗重試的原則;2.將堆里面的空間進行按線程分配,每個線程在隊中都會有塊內存,當線程分配內存時,直接分配到自己線程的那塊內存當中,當那小塊內存用完時,在進行CAS同步申請新的內存,這種小塊內存叫做==本地線程分配緩存(TLAB)==。

設置初始值

==分配完內存之后需要給這部分內存設置零值,不包括對象頭。當通過TLAB分配內存時,其實在分配內存的時候就可以設置零值,不需要等到分配完在設置,因為這部分內存區(qū)域是已知的不會出現(xiàn)分配時產生并發(fā)的問題==

在程序中可能會出現(xiàn)的問題

解釋:這步操作也就是說當對象分配到內存后就可以直接使用里面的字段,==但是這個是初始值==,如果說當我分配完內存后直接使用這個字段的話程序肯定會出問題(因為CPU是亂序執(zhí)行的,當兩個操作互不關聯(lián)時,一個操作耗時一個操作不耗時,這時候CPU會進行優(yōu)化讓不耗時的先運行。而且一個創(chuàng)建對象的過程需要多行字節(jié)碼來完成,所以可能會出現(xiàn)重排序的問題,但是這個概率特別低)這時候就需要用volatile關鍵字來保證有序性。

?其本身是通過在JVM平臺上面的Load,Store兩個讀寫屏障組合來保證的,對應于intel的X86來說是基于MESI協(xié)議來保證的。其實JVM平臺規(guī)定了一些不能亂序執(zhí)行的原則:HappenBefore原則,里面就規(guī)定了volitaile關鍵字

?

設置對象頭

當對象中的字段設置為對應的默認值(零值)時,需要設置對象頭里面的數(shù)據,這部分數(shù)據包括兩部分:

對象頭數(shù)據結構

1.==對象自身運行時的數(shù)據== 比如:哈希碼(延遲到真正調用hashcode()方法時才生成) 鎖狀態(tài)標志 線程持有鎖 偏向鎖的線程ID 偏向時間戳 對象分代年齡 ...... 在未開啟壓縮指針的情況下,根據32位虛擬機和64位虛擬機不同,這部分數(shù)據的總大小分別是32個比特和64個比特。這部分數(shù)據叫做“Mark Word”,由于對象運行時存儲的數(shù)據很多,所以Mark Word是一個動態(tài)的數(shù)據結構,有些數(shù)據其實根本用不到所以某些數(shù)據其實是沒有必要立馬就存儲的。

?32位的虛擬機中,MarkWord是32個比特,其中哈希碼占用25個比特,分代年齡占用4個,鎖標志位占用兩個,剩下的另外一個比特固定為0。

?

2.==類型指針== 指向類的元數(shù)據信息,通過這個指針來確定該對象屬于哪個類的實例。

?(不是所有的虛擬機都必須在對象數(shù)據上設置類型指針)

?

==當對象是數(shù)組。。。。==

?如果對象是數(shù)組,在對象頭中還會記錄數(shù)組長度,普通JAVA對象可以通過找到類的元數(shù)據信息確定JAVA對象的大小,但是數(shù)組長度是不能通過類的元數(shù)據信息推導出來的,所以需要在對象頭中設置數(shù)組長度

?

Class文件的<.init>

當設置完字段的默認值和對象頭的數(shù)據后,這個時候該調用Class對象的<.init>方法了即構造函數(shù)。

對象的內存布局

當了解完前面的對象創(chuàng)建流程時,相信對于對象在堆中的內存布局也已經有兩大概的輪廓了,接下來進行總結:

==分為三部分:對象頭,實例數(shù)據,對齊填充==

1.對象頭前面已經詳細講過了,就不在闡述了

2.實例數(shù)據:記錄父類和當前類中定義的字段,存儲的順序默認是:long/doubles , ints , shorts/chars , bytes/booleans , oops。默認順序遵從的原則是相同寬度的字段分配到一起,接著父類定義的變量在子類定義的變量的簽名。

3.對齊填充:==不是必然的== 占位符。由于HotSpot虛擬機自動內存管理系統(tǒng)要求對象的起始地址必須是8字節(jié)的整數(shù)倍,也就是對象的大小都必須是8的倍數(shù)。對象頭剛剛說了無非是32比特或者64比特默認就是八字節(jié)的,所以當實例數(shù)據滿足八的倍數(shù)時,就不需要占位符,這部分數(shù)據也就沒有;如果不滿足八的倍數(shù),將添加占位符使整個對象大小為八的倍數(shù)。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2972

    瀏覽量

    104865
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12239
  • 虛擬機
    +關注

    關注

    1

    文章

    919

    瀏覽量

    28283
收藏 人收藏

    評論

    相關推薦

    請問單例對象會被jvm的gc時回收嗎?

    單例對象會被jvm的gc時回收嗎?
    發(fā)表于 11-09 07:02

    解讀rtt的c的面向對象對象創(chuàng)建及其啟動初始化流程

    解讀rtt的c的面向對象對象創(chuàng)建及其啟動初始化流程,最后總結面向對象語言與c面向對象的區(qū)別。目
    發(fā)表于 07-05 11:01

    java如何創(chuàng)建對象的分析

    作為Java開發(fā)者,我們每天創(chuàng)建很多對象,但我們通常使用依賴管理系統(tǒng),比如Spring去創(chuàng)建對象。然而這里有很多創(chuàng)建
    發(fā)表于 09-27 14:36 ?0次下載

    使用JavaScript創(chuàng)建對象的方法和案例

    Javascript中的一切幾乎都是對象,無論是數(shù)組還是函數(shù)。本文將教你使用JavaScript創(chuàng)建對象的三種方法。
    的頭像 發(fā)表于 07-06 09:41 ?2950次閱讀

    一文詳解Java對象內存布局

    這個實例對象是以怎樣的形態(tài)存在內存中的? 一個Object對象內存中占用多大? 對象中的屬性是如何在
    發(fā)表于 09-30 14:38 ?1212次閱讀
    一文詳解Java<b class='flag-5'>對象</b>的<b class='flag-5'>內存</b><b class='flag-5'>布局</b>

    JVM內存布局的多方面了解

      JVM內存布局規(guī)定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運行。不同的
    發(fā)表于 07-08 15:09 ?416次閱讀

    在JavaScript中動態(tài)的創(chuàng)建QML對象

    在實際QML應用開發(fā)中,我們可以在JavaScript中動態(tài)的創(chuàng)建QML對象。這樣做可以延遲對象的實例化,當我們在需要創(chuàng)建對象的時候才在Ja
    的頭像 發(fā)表于 09-01 10:42 ?1583次閱讀

    探討JVM內存布局

    JVM內存布局規(guī)定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運行。
    的頭像 發(fā)表于 09-09 15:57 ?845次閱讀

    Java中創(chuàng)建對象有哪些方式

    1 問題 作為Java開發(fā)者,經常創(chuàng)建很多對象,你是否知道Java中創(chuàng)建對象有哪些方式呢?
    的頭像 發(fā)表于 02-24 10:29 ?1065次閱讀

    JVM內存布局詳解

    JVM內存布局規(guī)定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運行。不同的J
    的頭像 發(fā)表于 04-26 10:10 ?539次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>內存</b><b class='flag-5'>布局</b>詳解

    Java反射技術實現(xiàn)對象創(chuàng)建

    一. 基礎概念 Java中,一般我們創(chuàng)建一個對象可能會選擇new一下個實例。但是隨著我們技術的不斷提升,我們也學習到了,可以通過反射技術實現(xiàn)對象創(chuàng)建。 可是,你有沒有想一下,什么時候
    的頭像 發(fā)表于 05-22 14:25 ?2327次閱讀
    Java反射技術實現(xiàn)<b class='flag-5'>對象</b>的<b class='flag-5'>創(chuàng)建</b>

    詳解Java虛擬機的JVM內存布局

    JVM內存布局規(guī)定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運行。不同的J
    的頭像 發(fā)表于 07-13 09:52 ?533次閱讀
    詳解Java虛擬機的<b class='flag-5'>JVM</b><b class='flag-5'>內存</b><b class='flag-5'>布局</b>

    JVM內存對象監(jiān)控和優(yōu)化問題描述及解決辦法

    服務器內存問題是影響應用程序性能和穩(wěn)定性的重要因素之一,需要及時排查和優(yōu)化。本文介紹了某核心服務內存問題排查與解決過程。首先在JVM與大對象優(yōu)化上進行了有效的實踐,其次在故障轉移與大
    的頭像 發(fā)表于 08-28 11:39 ?1182次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>內存</b>大<b class='flag-5'>對象</b>監(jiān)控和優(yōu)化問題描述及解決辦法

    淺析JVM內存對象監(jiān)控和優(yōu)化實踐的過程

    音樂業(yè)務中,core服務主要提供歌曲、歌手等元數(shù)據與用戶資產查詢。隨著元數(shù)據與用戶資產查詢量的增長,一些JVM內存問題也逐漸顯露,例如GC頻繁、耗時長,在高峰期RPC調用超時等問題,導致業(yè)務核心功能受損。
    的頭像 發(fā)表于 09-06 10:14 ?622次閱讀
    <b class='flag-5'>淺析</b><b class='flag-5'>JVM</b><b class='flag-5'>內存</b>大<b class='flag-5'>對象</b>監(jiān)控和優(yōu)化實踐的過程

    jvm內存區(qū)域由哪幾部分組成

    。下面將詳細介紹這些部分。 堆內存(Heap Memory):堆內存JVM中最大的一塊內存區(qū)域,用來存儲對象實例和數(shù)組
    的頭像 發(fā)表于 12-05 14:10 ?839次閱讀
    主站蜘蛛池模板: 手机看片福利1024| 精品久久免费观看| 丁香六月婷婷激情| 成人a级特黄毛片| 在线播放免费观看| 天天色国产| 狠狠操精品视频| 久色tv| 男人j进女人j免费视频视频| 最新理论三级中文在线观看| 亚洲色图日韩| 日本特黄a级高清免费酷网| 美女淫| 成人精品视频一区二区三区| 天天做天天爱天天爽天天综合| 久久午夜网| 欧美极品| 欧美一区二区三区大片| 欧美视频小说| 国产一区二区三区四卡| 永久手机看片福利盒子| 欧美一级视频在线高清观看| 高清在线观看视频| 亚洲一区欧美二区| 亚色国产| 久久久久88色偷偷| 夜夜骑天天操| 777影院| aaaaa毛片| 欧美在线视频二区| 成人涩涩网站| 国产重口老太和小伙乱视频| 日韩一卡2卡三卡4卡无卡网站| 亚洲成人资源| 精品噜噜噜噜久久久久久久久| 午夜痒痒网| 日本xxxⅹ69xxxx护士| 伊人久久精品成人网| 男人天堂网www| 五月天婷婷丁香中文在线观看| 亚洲1234区乱码|