最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解jvm對象的創(chuàng)建和分配

 更新時間:2021年03月09日 09:46:16   作者:萌新J  
這篇文章主要介紹了jvm對象的創(chuàng)建和分配的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

對象的創(chuàng)建

創(chuàng)建方式

1、 new 關(guān)鍵字直接創(chuàng)建。 new ObjectName()。

2、通過 Class 反射對象的 newInstance() 方法。ObjectName  obj  =  ObjectName.class.newInstance()。

3、通過 Class 反射對象獲取 Constructor 類,再調(diào)用其 newInstance() 方法。 ObjectName obj = ObjectName.class.getConstructor.newInstance()。

4、在類實現(xiàn) Cloneable 接口的前提下,使用對象的 clone() 方法。ObjectName obj = obj.clone()。(如果內(nèi)部有自定義類屬性,并且想要實現(xiàn)深克?。ㄐ聞?chuàng)建的對象和原有的對象不是同一個),那么就需要讓該屬性類也實現(xiàn) Cloneable 接口。

5、使用反序列化。(為了避免屬性丟失,需要讓類實現(xiàn) Serializable 接口)

public static void main(String[] args){
  try {
   ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FilePath))
   ObjectName obj = ois.readObject();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }

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

在對象身上,存儲了關(guān)于這個對象的所有信息。

創(chuàng)建過程

1、根據(jù)創(chuàng)建對象的信息去內(nèi)存中存放類信息的常量池中尋找是否存在要加載的類信息,如果存在直接創(chuàng)建對象;如果不存在就先進行該類的加載。

2、為對象分配空間。這里涉及到線程位置分配的安全和效率,比較復(fù)雜,會在下面詳細來說。

3、初始化分配到對應(yīng)的位置。

4、設(shè)置對象的對象頭。

5、執(zhí)行 init 方法(執(zhí)行非靜態(tài)代理塊和實例屬性的初始化以及執(zhí)行實例構(gòu)造方法)

對象的內(nèi)存分配

分配方式

1、指針碰撞:如果 Java 堆內(nèi)存是規(guī)整的,也就是對象的創(chuàng)建位置都是緊挨著的,這樣的話直接將指針指示器向空閑方向移動要創(chuàng)建對象大小的距離就可以了。

2、空閑列表:如果 Java 堆內(nèi)存是不規(guī)整的,那么就需要維護一個空閑列表來記錄哪些位置是空閑的以及多大。在分配時就在列表上查詢,找到合適的位置分配。

并發(fā)安全

由于在堆的線程共享的,所以對象的創(chuàng)建分配的空間可能同時也是另外一個線程對象創(chuàng)建的分配位置,這就導(dǎo)致了并發(fā)問題,所以為了保證對象創(chuàng)建的并發(fā)安全,可以有下面兩種方式:

1、在分配空間時進行同步處理(采用 CAS +回旋鎖的方式來保證)

2、TLAB:新的線程創(chuàng)建時會在堆中劃分一塊區(qū)域給該線程,后面該線程創(chuàng)建的對象都會在該位置存放,當(dāng)空間不足時才使用第一種方式。(HotSpot 使用)。

代碼優(yōu)化

1、棧上分配。通過逃逸分析判斷創(chuàng)建的對象是否逃逸出方法(也就是這個對象是否在當(dāng)前方法的外部被調(diào)用),如果沒有逃逸出方法,那么就有可能直接在棧上分類空間來保存。

2、同步省略。JIT 在編譯時會判斷同步塊所使用的鎖對象是否只能被一個線程訪問而沒有被發(fā)布到其他的線程。如果沒有,那么 JIT 編譯器在編譯這段代碼時就會取消這段代碼的同步。

3、分離對象(標(biāo)量替換)。有的對象可能不需要作為一個連續(xù)的內(nèi)存結(jié)構(gòu)存在也可以被訪問到,那么對象的部分(或全部)可以不存儲在內(nèi)存,而是存儲在棧中。

標(biāo)量:無法再被分解的數(shù)據(jù)。如一個類的基本數(shù)據(jù)類型屬性。

聚合量:還可以被分解的數(shù)據(jù)。如一個類的自定義屬性。

逃逸分析的不成熟性

關(guān)于逃逸分析目前還是處于不穩(wěn)定的階段,因為無法保證逃逸分析的性能消耗一定高于其節(jié)省的性能。簡單來說就是可能執(zhí)行了逃逸分析,結(jié)果發(fā)現(xiàn)都是逃逸出方法的對象,這樣逃逸分析并沒有提高性能,同時執(zhí)行逃逸分析也消耗了一定的性能,造成得不償失。所以,逃逸分析在 JVM 中沒有實現(xiàn) 棧上分配的功能的,但是其還是在 JIT 中起到了優(yōu)化作用。所以可以說對象都是創(chuàng)建在堆上的。而我們一般所說的對象創(chuàng)建在棧上,實際情況是因為標(biāo)量替換的作用。

實際的對象空間分配過程

首先會判斷是否可以進行標(biāo)量替換,如果可以直接使用標(biāo)量替換,然后結(jié)束。不可以的話再嘗試在當(dāng)前線程劃分的區(qū)域創(chuàng)建,如果區(qū)域不夠再嘗試使用 CAS+ 自旋鎖在其他位置劃分,失敗就再次嘗試,直到成功。

對象的訪問

Java 程序通過棧上的引用訪問堆中的對象。對象的訪問方式取決于 JVM 虛擬機上的實現(xiàn),目前主流的訪問方式是句柄和直接指針。

句柄

句柄相當(dāng)于一個中間表,存儲著對應(yīng)實例對象的地址以及實例數(shù)據(jù)所對應(yīng)類信息的地址。

優(yōu)勢:比較穩(wěn)定,當(dāng)對象被移動后(垃圾回收時移動對象是非常常見的事)時只需要改變句柄中的指針就可以了。句柄本身不需要改變。

直接指針

引用直接指向?qū)嵗龑ο?,在對象上保存對?yīng)的類信息所在的地址。

優(yōu)勢:查找快,在棧上的引用可以很快找到對應(yīng)的對象。這也是 HotSpot 默認的訪問方式。

以上就是詳解jvm對象的創(chuàng)建和分配的詳細內(nèi)容,更多關(guān)于jvm對象的創(chuàng)建和分配的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java?DelayQueue實現(xiàn)任務(wù)延時示例講解

    Java?DelayQueue實現(xiàn)任務(wù)延時示例講解

    DelayQueue是一個無界的BlockingQueue的實現(xiàn)類,用于放置實現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。本文就來利用DelayQueue實現(xiàn)延時任務(wù),感興趣的可以了解一下
    2022-09-09
  • Mybatis 實現(xiàn)動態(tài)組裝查詢條件,仿SQL模式

    Mybatis 實現(xiàn)動態(tài)組裝查詢條件,仿SQL模式

    這篇文章主要介紹了Mybatis 實現(xiàn)動態(tài)組裝查詢條件,仿SQL模式的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • IDEA導(dǎo)入eclipse項目并且部署到tomcat的步驟詳解

    IDEA導(dǎo)入eclipse項目并且部署到tomcat的步驟詳解

    這篇文章主要給大家介紹了關(guān)于IDEA導(dǎo)入eclipse項目并且部署到tomcat的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • springboot對數(shù)據(jù)庫密碼加密的實現(xiàn)

    springboot對數(shù)據(jù)庫密碼加密的實現(xiàn)

    這篇文章主要介紹了springboot對數(shù)據(jù)庫密碼加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java ThreadPoolExecutor 線程池的使用介紹

    Java ThreadPoolExecutor 線程池的使用介紹

    Executors 是一個Java中的工具類. 提供工廠方法來創(chuàng)建不同類型的線程池,這篇文章主要介紹了Java ThreadPoolExecutor 線程池的使用介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java中區(qū)別.toString() ,(String),valueOf()方法

    Java中區(qū)別.toString() ,(String),valueOf()方法

    這篇文章主要介紹了Java中區(qū)別.toString() ,(String),valueOf()方法,需要的朋友可以參考下
    2017-01-01
  • Eclipse中創(chuàng)建Web項目最新方法(2023年)

    Eclipse中創(chuàng)建Web項目最新方法(2023年)

    在Java開發(fā)人員中,最常用的開發(fā)工具應(yīng)該就是Eclipse,下面這篇文章主要給大家介紹了關(guān)于Eclipse中創(chuàng)建Web項目2023年最新的方法,需要的朋友可以參考下
    2023-09-09
  • Springboot框架整合添加redis緩存功能

    Springboot框架整合添加redis緩存功能

    緩存就是一個存儲器,在技術(shù)選型中,常用?Redis?作為緩存數(shù)據(jù)庫。緩存主要是在獲取資源方便性能優(yōu)化的關(guān)鍵方面。Redis?是一個高性能的?key-value?數(shù)據(jù)庫,接下來通過本文給大家介紹Springboot框架整合添加redis緩存功能,感興趣的朋友一起看看吧
    2021-11-11
  • Selenium處理select標(biāo)簽的下拉框

    Selenium處理select標(biāo)簽的下拉框

    Selenium是一個開源的和便攜式的自動化軟件測試工具,用于測試Web應(yīng)用程序有能力在不同的瀏覽器和操作系統(tǒng)運行。接下來通過本文給大家介紹Selenium處理select標(biāo)簽的下拉框,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • 基于java中的null類型---有關(guān)null的9件事

    基于java中的null類型---有關(guān)null的9件事

    這篇文章主要介紹了java中的null類型---有關(guān)null的9件事,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

新密市| 通海县| 大同县| 丹棱县| 阜新市| 克山县| 阳新县| 株洲县| 兴仁县| 延安市| 石屏县| 镇安县| 佛坪县| 祥云县| 高陵县| 个旧市| 格尔木市| 平远县| 湄潭县| 正安县| 台前县| 博兴县| 临江市| 东港市| 凤翔县| 沈丘县| 乾安县| 巴青县| 寻乌县| 巍山| 陕西省| 佛山市| 濉溪县| 荃湾区| 仙游县| 沙田区| 临颍县| 彩票| 永顺县| 香河县| 息烽县|