溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java對象的創(chuàng)建方法

發(fā)布時間:2021-07-15 18:25:42 來源:億速云 閱讀:165 作者:chen 欄目:大數(shù)據(jù)

本篇內容介紹了“Java對象的創(chuàng)建方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Java對象的創(chuàng)建過程,從虛擬機接收到字節(jié)碼new指令開始。

1 檢查階段

虛擬機遇到new指令之后,會根據(jù)new指令的參數(shù)去常量池中定位類的符號引用,并且檢查這個符號引用代表的類,是否已經加載、解析、初始化,如果沒有,則需要先執(zhí)行相應的類加載過程。

如果類加載檢查通過了,虛擬機則會為新對象分配內存,具體分配多少,在類加載完成后就能確定。

2 內存分配

為對象分配內存的過程,就相當于把一塊確定大小的內存,從Java堆中劃分出來,這個劃分的方式,主要有兩種:一是指針碰撞,二是空閑列表,兩種方式有不同的應用場景。

2.1 指針碰撞

指針碰撞適用于絕對規(guī)整的Java堆內存,即Java堆內存中,被使用過的內存在一邊,空閑的內存在另外一邊,以一個指針作為分界,分配內存的過程就是指針向空閑的一邊移動固定大小的過程,簡單而高效。

Java對象的創(chuàng)建方法

2.2 空閑列表

Java堆中的內存,很可能不是絕對規(guī)整,而是使用過的內存和空閑內存互相交錯存在的。這種情況,為對象分配內存就可以使用空閑列表的方式。虛擬機將堆中哪些內存是空閑的記錄在一個列表中,在為對象分配內存的時,從列表中記錄的內存中找到足夠大的一塊劃分給新對象,并更新列表中的記錄。

Java對象的創(chuàng)建方法

2.3 內存分配方式的依據(jù)

具體使用哪種方式為新對象分配內存取決于Java堆內存是否規(guī)整,而Java堆內存是否規(guī)整,取決于采用的垃圾收集器是否具有 空間壓縮整理 的能力。當使用具有空間壓縮整理能力的垃圾收集器時(如Serial,ParNew等),虛擬機使用指針碰撞的方式為對象分配內存,而當使用CMS這種基于清除算法的收集器時,理論上就只能采用空閑列表的方式為對象分配內存。

2.4 內存分配的問題和解決方案

在Java應用中,對象的創(chuàng)建非常頻繁,對應Java虛擬機為新對象分配內存的行為也非常頻繁,而虛擬機為對象分配內存的操作在并發(fā)時并不是線程安全的,因為分配和移動指針、分配內存和修改空閑空間列表都不是原子性操作,很可能多個對象的內存分配是基于指針指向的同一個位置或者多個對象被分配到了同一塊空閑空間。解決這種問題有兩種方案:

  1. 對給對象分配空間的操作進行同步處理,保證同一時間只能對一個對象分配內存

  2. 預先為每個線程在Java堆中分配獨立的空間,也就是本地線程分配緩沖。

    這樣每個線程為對象分配內存都是在各自的線程緩沖區(qū)中進行,也就不會有線程安全問題了。

    但是,緩沖區(qū)用完時,重新分配緩沖區(qū)的操作還是要進行同步鎖定的。

    虛擬機通過 -XX:+/-UseTLAB 設定是否使用 本地線程分配緩沖

3 將內存初始化為零值

內存分配完成之后,虛擬機還必須將分配到的對象頭之外的空間都置為零值(如果使用了TLAB,也可以在分配TLAB時置零),這樣可以保證對象的屬性字段不賦初始值就可以使用,此時程序訪問這些字段將得到字段類型對應的零值(byte,short,int,long對應的是 0,float和double對應的是 0.0,boolean對應的是 false,char對應的是 \u0000,引用類型對應的也是null)

4 設置對象頭信息

根據(jù)是否使用偏向鎖,設置對象頭信息,如對象是哪個類的實例、對象的hash碼、對象的GC分代年齡等

“Java對象的創(chuàng)建方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI