麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > new 一個對象的過程和clone 一個對象的過程?

new 一個對象的過程和clone 一個對象的過程?

來源:千鋒教育
發布人:qyf
時間: 2022-06-07 16:18:00 1654589880

  對象的創建過程

  1、類加載

  當虛擬機遇到一個 new 指令的時候,會先去檢測這個指令的參數是否能定位到這個類的符號引用,并檢查這個類是否被加載、解析、初始化過(在 JVM 的方法區中檢查)。如果沒有,則執行類加載(類加載機制)

  2、內存分配

  在類加載通過之后,虛擬機將為新生對象分配內存,對象所需內存的大小在類加載完成后便可完全確定,相當于從 Java 堆中抽取一塊內存出來;而根據內存的是否絕對規整,分為指針碰撞和空閑列表兩種分配方式:

  指針碰撞:假設 Java 堆中的內存是絕對規整的,分為空閑和非空閑兩種,中間用一個指針當做劃分界限的指示器;當一個新對象需要分配對象時,相當于把指針向空閑區域移動一段與對象大小相等的距離。

  空閑列表:假設 Java 堆的內存不是絕對規整的,空閑和非空閑是相互交錯的,那就需要一個 OopMap 列表,用來記錄哪些內存塊是可以用的,在對象分配內存時,劃分一塊大小相等的區域給對象,并更新這個列表

  從上面的解釋看,用哪種分配方式,是通過 Java 堆的內存塊是否絕對規整決定的。

  堆內存是否規整,主要是看 GC 回收了內存之后是否包含壓縮或者整理功能.如果有,那么內存就比較規整.否則如果沒有,創建對象就需要采用空閑列表的方式.

  比如:serial,ParNew 等帶有整理的收集器,可以使用指針碰撞.CMS 使用簡單清除的算法,可以使用空閑列表.

  但對象的創建是頻繁的,在并發的情況,多線程不一定是安全的,即存在 A 對象在分配內存,指針還未來得及修改,B 對象也同時使用了原來的指針來分配對象。所以又衍生了兩種解決辦法,CAS+失敗重試 和 TLAB 兩種方式

  CAS+失敗重試:虛擬機采用 CAS 配上失敗重試的方式保證更新操作的原子性 (關于 CAS 鎖,是樂觀鎖的一種實現,解釋起來也比較麻煩,

  TLAB:本地線程分配緩沖,把內存分配的動作按照線程分配劃分在不同的空間中進行,即每個線程在 Java 堆中預先分配一小塊內存,哪個線程需要需要分配,先在 TLAB 中分配,用完了并重新分配新的 TLAB 時,才需要同步鎖定。

  3、初始值為零

  在內存分配完成之后,虛擬機需要將分配到的內存空間初始化為零值 (除對象頭外),這一步操作也保證了對象的實例字段在 java 代碼中可以不賦初始值就可以使用,因為程序能訪問這些字段的數據類型所對應的零值。

  4、設置對象頭

  初始值設置之后,怎么知道對象是哪個類的實例,如何才能找到類的元數據信息、哈希碼、GC 分代年齡等信息呢?這就需要對對象頭進行一些必要的設置,才能定位到。

  5、入棧、執行 init 指令

  從虛擬機來看,對象已經分配產生完成了,且入棧了;但 Java 程序來看,這才剛開始,所以,new 之后,則執行 init 方法,進行初始化。

  6、Java 對象的內存分布(即實例化后的對象在堆中的分布)

  對象在內存中的存儲布局可分為 3 部分:

圖片 2

  對象頭

  其中對象頭又可以細分為兩部分:

  1、存儲對象自身運行時數據:如哈希碼、GC 分代年齡、鎖狀態標志、線程持有的、偏向線程 ID 等信息

  2、類型指針:即對象指向它的類元數據的指針,虛擬機通過這個來確定這個對象是哪個類的實例(比如是指向棧中的類聲明)

  實例數據

  是對象真正存儲的有效信息,比如程序中定義的各種類型的字段內容,無論父類和子類都會記錄下來;在分配時,相同寬度的字段會被分配到一起,這也是父類定義的變量會出現在子類之前的原因。

  對齊填充

  沒啥實際意義,就是為了保證對象是 8 個字節的整數倍,沒對齊時,用來補全而已。

  7、對象的訪問定位

  使用對象時,通過棧上的 reference 數據來操作堆上的具體對象。

  建立對象是為了使用對象,Java 程序需要通過棧上的 reference 數據來操作堆上的具體對象;但這些訪問方式取決于虛擬機實現而定,目前主流有句柄和直接指針兩種:

  句柄:從 Java 堆中劃分出一塊內存用來作為句柄池,reference 中存儲的就是對象的句柄地址,而句柄包含了對象實例數據與類型數據各自的具體地址信息,如下圖(圖片來自 Java 虛擬機第三版)

圖片 3

  直接指針:在直接指針中,reference 儲存的就是對象地址,所以,需要考慮的是如何防止訪問類型數據的相關信息(圖片來自 Java 虛擬機第三版)

圖片 4

  優點介紹:

  句柄:使用句柄好處是,reference 中存放的是文檔的句柄地址,對象被移動時,只改變句柄的實例數據指針,而 reference 本身不需要修改

  直接指針:使用直接指針的最大好處就是速度更快,節省了指針定位的開銷;

  HotSpot 使用第二種方式進行對象訪問的.

  三、對象的具體實例化過程

  1、 在堆內存中開辟一塊空間

  2、 開辟空間分配一個地址(指針碰撞或者空閑列表兩種分配方式)

  3、把對象的所有非靜態成員加載到所開辟的空間下(從方法區的非靜態區域中加載,類加載的時候.class 文件的非靜態內容就是加載到這里的)

  4、 所有的非靜態成員加載完成之后,對所有非靜態成員變量進行默認初始化

  5、 所有非靜態成員變量默認初始化完成之后,調用構造函數

  6、 在構造函數入棧執行時,分為兩部分:先執行構造函數中的隱式三步,再執行構造函數中書寫的代碼:.1、隱式三步:1、執行 super 語句,2、對開辟空間下的所有非靜態成員變量進行顯式初始化3、執行構造代碼塊(注:代碼塊與非靜態成員變量顯示初始化無先后順序,與代碼順序相關,如代碼塊在上,則先加載代碼塊),4、在隱式三步執行完之后,執行構造函數中書寫的代碼

  7、在整個構造函數執行完并彈棧后,把空間分配的地址賦值給一個引用對象(對象的訪問定位有句柄和直接指針兩種方式)

  至此,Java 堆中有一塊內存新的內存 存儲這個實例化的對象,對象里面包含了對象頭、實例數據以及對齊填充。其中對象頭又可以細分為兩部分:

  1、存儲對象自身運行時數據:如哈希碼、GC 分代年齡、鎖狀態標志、線程持有的、偏向線程 ID 等信息

  2、類型指針:即對象指向它的類元數據的指針,虛擬機通過這個來確定這個對象是哪個類的實例(比如是指向棧中的類聲明)

  實例數據是對象真正存儲的有效信息。對齊填充沒什么大用處。

  更多關于“Java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓經驗,課程大綱更科學更專業,有針對零基礎的就業班,有針對想提升技術的好程序員班,高品質課程助理你實現java程序員夢想。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 伊甸园在线观看国产| 亚洲国产精品va在线观看麻豆| 北条麻妃大战黑人| 日本免费三区| 日韩精品一区二区三区中文| 亚洲精品自拍视频| 美国式禁忌在完整有限中字| 444kkk视频在线观看国产| 樱桃视频高清免费观看在线播放| 免费看美女部位隐私直播| 美女扒开胸露出奶乳免费视频| 三级黄色片在线观看| 日韩视频在线观看| jux434被公每天侵犯的我| 女人说疼男人就越往里| 波多野结衣教师系列5| 中国美团外卖男男china| 色人格第四色| 一级片在哪里看| 美国式禁忌矿桥矿17集| 黑白配hd视频| 欧美三级黄视频| 欧美色视频在线观看| 老少交欧美另类| 粗大的内捧猛烈进出在线视频 | 嗯啊用力视频| 人体大胆做受免费视频| 好男人在线神马影视www在线观看| 中国老太大bbw| 久久电影网午夜鲁丝片免费| 泰国一级淫片免费看| 亚洲欧美日韩综合一区| 中文字幕1页| 美女张开双腿让男生捅| 美国式禁忌5太大了| 天天射天天操天天| 一级毛片成人免费看免费不卡| 国产成人三级经典中文| 武侠古典一区二区三区中文| 亚洲欧美中文字幕| 精品大臿蕉视频在线观看|