<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          new一個(gè)女朋友?

          共 2594字,需瀏覽 6分鐘

           ·

          2021-04-16 02:11




          前言

          反正我也不知道這篇講什么,我就看見(jiàn)這個(gè)央視主播,然后沖著女朋友三個(gè)字來(lái)的,我就是想看看大魚來(lái)如何給大家分配女朋友的

          一起看看吧,new一個(gè)女朋友到底是什么過(guò)程

          在語(yǔ)言層面創(chuàng)建對(duì)象(例如克隆、反序列化)通常僅僅是一個(gè)new關(guān)鍵字而已,類似于GirlFriend Alen = new GrilFriend("18");

          而在虛擬機(jī)中,對(duì)象(普通Java對(duì)象,不包括數(shù)組和Class對(duì)象等)的創(chuàng)建時(shí)一個(gè)怎么樣的過(guò)程?

          找女朋友,習(xí)慣性思維首先考慮的范圍一般就是從自己的認(rèn)知人群中去定位,定位到了一個(gè),年齡18,還得看看人家有沒(méi)有男朋友,人家要是有男朋友,你再去撩人家就不合適了吧,如果定位不到合適的就再去發(fā)展

          虛擬機(jī)也是同樣的道理

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

          看上一篇



          找女朋友

          經(jīng)過(guò)五年八個(gè)月零三天四小時(shí)二十五分32秒之后,恭喜你,有了對(duì)象了,但是對(duì)象往哪里,別廢話,安排

          在類加載檢查通過(guò)后,接下來(lái)虛擬機(jī)將為新生的對(duì)象分配內(nèi)存

          對(duì)象所需的內(nèi)存的大小在類加載完成后便可以完全確定,為對(duì)象分配空間的任務(wù)等同于把一塊確定大小的內(nèi)存從Java堆中劃分出來(lái)

          目前最常用的劃分方式分為兩種:

          指針碰撞

          假設(shè)Java堆的內(nèi)存是絕對(duì)規(guī)整的,所有用過(guò)的內(nèi)存都放一邊,空閑的內(nèi)存放在另一邊,中間放著一個(gè)指針作為分界點(diǎn)的指示器,那所分配內(nèi)存就僅僅把那個(gè)指針向空閑空間那邊挪動(dòng)一段與對(duì)象大小相等的距離。

          空閑列表

          如果Java堆中的內(nèi)存并不是規(guī)整的,已使用的內(nèi)存和空間的內(nèi)存是相互交錯(cuò)的,虛擬機(jī)必須維護(hù)一個(gè)空閑列表,記錄上哪些內(nèi)存塊是可用的,在分配時(shí)候從列表中找到一塊足夠大的空間劃分給對(duì)象使用。

          下面這一步是為了啥呢,怕你的女朋友被別人搶過(guò)去,倒不是說(shuō)你不夠優(yōu)秀,你想啊,萬(wàn)一你朋友不知道這是你女朋友,然后你朋友向你的女朋友告白了,你尷尬不,這不問(wèn)題大了嗎,于是有了接下來(lái)的這個(gè)

          除了如何劃分可用空間外,在并發(fā)情況下劃分不一定是線程安全的,有可能出現(xiàn)正在給A對(duì)象分配內(nèi)存,指針還沒(méi)有來(lái)得及修改,對(duì)象B又同時(shí)使用了原來(lái)的指針?lè)峙鋬?nèi)存的情況,解決這個(gè)問(wèn)題兩種方案:

          分配內(nèi)存空間的動(dòng)作進(jìn)行同步處理:實(shí)際上虛擬機(jī)采用CAS配上失敗重試的方式保證了更新操作的原子性。

          內(nèi)存分配的動(dòng)作按照線程劃分在不同的空間中進(jìn)行:為每個(gè)線程在Java堆中預(yù)先分配一小塊內(nèi)存,稱為本地線程分配緩沖(Thread Local Allocation Buffer, TLAB)。

          女朋友有了,住的地方也給安排了,趕緊把這個(gè)住的地方打掃干凈,省的發(fā)現(xiàn)你上一個(gè)女朋友的痕跡

          內(nèi)存分配完后,虛擬機(jī)需要將分配到的內(nèi)存空間中的數(shù)據(jù)類型都初始化為零值(不包括對(duì)象頭)

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

          做完以上以后,從虛擬機(jī)視角來(lái)看,一個(gè)新的對(duì)象已經(jīng)產(chǎn)生了,但是Java程序視角來(lái)看,執(zhí)行new操作后會(huì)接著執(zhí)行方法,把對(duì)象按照程序員的意愿進(jìn)行初始化,這樣一個(gè)真正的對(duì)象就產(chǎn)生了

          一個(gè)真正的女朋友誕生了,一段美好的愛(ài)情開(kāi)始了

          對(duì)象的內(nèi)存布局

          一起來(lái)看看對(duì)象的內(nèi)存布局吧,淦,大魚你別開(kāi)車,車速還這么快,我跟不上了(嚶

          你在說(shuō)啥,我說(shuō)的是想了解下對(duì)象的身份信息

          在HotSpot虛擬機(jī)中,對(duì)象在內(nèi)存中的存儲(chǔ)的布局可以分為3塊區(qū)域:對(duì)象頭(Header)、實(shí)例數(shù)據(jù)(Instance Data)和對(duì)齊填充(Padding

          對(duì)象頭

          第一部分用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈希碼、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID、偏向時(shí)間戳等,官方稱為“Mark Word”

          第二部分類型指針,即對(duì)象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象的哪個(gè)實(shí)例

          實(shí)例數(shù)據(jù):對(duì)象真正存儲(chǔ)的有效信息,也是在程序代碼中所定義的各種類型的字段內(nèi)容。

          對(duì)齊填充對(duì)齊填充不是必然存在的,也沒(méi)有特別的含義,僅僅起著占位符的作用。



          對(duì)象的訪問(wèn)定位

          對(duì)象和閨蜜出去旅游了,為了她的安危,需要隨時(shí)做定位,為旅游保駕護(hù)航

          建立對(duì)象是為了使用對(duì)象,我們的Java程序需要通過(guò)棧上的reference數(shù)據(jù)來(lái)操作堆上的具體對(duì)象。目前主流訪問(wèn)方式有使用句柄和直接指針兩種

          句柄訪問(wèn):Java堆中將會(huì)劃分出一塊內(nèi)存來(lái)作為句柄池,reference中存儲(chǔ)的就是對(duì)象句柄位置,而句柄中包含了對(duì)象實(shí)例數(shù)據(jù)與類型數(shù)據(jù)各自的具體地址信息

          直接指針訪問(wèn):如果使用直接指針訪問(wèn),那么Java堆對(duì)象的布局中就必須考慮如何放置訪問(wèn)類型數(shù)據(jù)的相關(guān)信息,而reference中存儲(chǔ)的直接就是對(duì)象地址。


           


          求贊



           

          好了,以上就是全部?jī)?nèi)容了,我是小魚仙,你們的學(xué)習(xí)成長(zhǎng)小伙伴

                                       

          我希望有一天能夠靠寫字養(yǎng)活自己,現(xiàn)在還在磨練,這個(gè)時(shí)間可能會(huì)有很多年,感謝你們做我最初的讀者和傳播者。請(qǐng)大家相信,只要給我一份愛(ài),我終究會(huì)還你們一頁(yè)情的。

          再次感謝大家能夠讀到這里,我后面會(huì)持續(xù)的更新技術(shù)文章以及一些記錄生活的靈魂文章,如果覺(jué)得不錯(cuò)的,覺(jué)得大魚同學(xué)有點(diǎn)東西的話,求點(diǎn)贊、關(guān)注、分享三連

          哦,對(duì)了!后續(xù)的更新文章我都會(huì)及時(shí)放到這里,歡迎大家點(diǎn)擊觀看,都是干貨文章啊,建議收藏,以后隨時(shí)翻閱查看

          https://github.com/DayuMM2021/Java

           

          推薦閱讀


          ● 面試官問(wèn)我:你確定用了BigDecimal后,計(jì)算結(jié)果一定精確?

             ● 這個(gè)GitHub地址,真香

          ● 消息隊(duì)列入門

             ● 搞懂什么是RocketMQ



          瀏覽 56
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰人人在线 | 日韩欧美高清 | 久久激情亚洲色 | 97国产免费 | 久久久久资源站 |