亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

對(duì)象的創(chuàng)建

創(chuàng)建方式

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

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

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

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

5、使用反序列化。(為了避免屬性丟失,需要讓類實(shí)現(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();
  }
 }

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

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

創(chuàng)建過(guò)程

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

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

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

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

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

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

分配方式

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

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

并發(fā)安全

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

1、在分配空間時(shí)進(jìn)行同步處理(采用 CAS +回旋鎖的方式來(lái)保證)

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

代碼優(yōu)化

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

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

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

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

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

逃逸分析的不成熟性

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

實(shí)際的對(duì)象空間分配過(guò)程

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

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

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

句柄

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

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

直接指針

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

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

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

相關(guān)文章

  • SpringBoot中實(shí)現(xiàn)數(shù)據(jù)字典的示例代碼

    SpringBoot中實(shí)現(xiàn)數(shù)據(jù)字典的示例代碼

    這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)數(shù)據(jù)字典的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java 設(shè)計(jì)模式之適配器模式詳解

    Java 設(shè)計(jì)模式之適配器模式詳解

    設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性
    2021-11-11
  • 教新手使用java如何對(duì)一個(gè)大的文本文件內(nèi)容進(jìn)行去重

    教新手使用java如何對(duì)一個(gè)大的文本文件內(nèi)容進(jìn)行去重

    用HashSet對(duì)內(nèi)容去重這個(gè)過(guò)程jvm會(huì)內(nèi)存溢出,只能首先將這個(gè)大文件中的內(nèi)容讀取出來(lái),對(duì)每行String的hashCode取模取正整數(shù),可用取模結(jié)果作為文件名,將相同模數(shù)的行寫入同一個(gè)文件,再單獨(dú)對(duì)每個(gè)小文件進(jìn)行去重,最后再合并
    2021-06-06
  • Mybatis?sql與xml文件讀取方法詳細(xì)分析

    Mybatis?sql與xml文件讀取方法詳細(xì)分析

    這篇文章主要介紹了Mybatis?sql與xml文件讀取方法,在執(zhí)行一個(gè)自定義sql語(yǔ)句時(shí),dao對(duì)應(yīng)的代理對(duì)象時(shí)如何找到sql,也就是dao的代理對(duì)象和sql之間的關(guān)聯(lián)關(guān)系是如何建立的
    2023-01-01
  • Idea啟動(dòng)多個(gè)SpringBoot項(xiàng)目的3種最新方案

    Idea啟動(dòng)多個(gè)SpringBoot項(xiàng)目的3種最新方案

    SpringBoot自帶Tomcat,直接運(yùn)行main方法里面的SpringApplication.run即可,并且訪問(wèn)時(shí)不需要帶項(xiàng)目名,這篇文章主要介紹了Idea啟動(dòng)多個(gè)SpringBoot項(xiàng)目的3種方案,需要的朋友可以參考下
    2023-02-02
  • java.sql.SQLRecoverableException關(guān)閉的連接異常問(wèn)題及解決辦法

    java.sql.SQLRecoverableException關(guān)閉的連接異常問(wèn)題及解決辦法

    當(dāng)數(shù)據(jù)庫(kù)連接池中的連接被創(chuàng)建而長(zhǎng)時(shí)間不使用的情況下,該連接會(huì)自動(dòng)回收并失效,就導(dǎo)致客戶端程序報(bào)“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關(guān)閉的連接”異常問(wèn)題,下面給大家分享解決方案,一起看看吧
    2024-03-03
  • 深入解析Java中ThreadLocal線程類的作用和用法

    深入解析Java中ThreadLocal線程類的作用和用法

    ThreadLocal為解決多線程程序的并發(fā)問(wèn)題提供了一種新的思路,ThreadLocal并不是一個(gè)Thread,而是Thread的局部變量,本文就來(lái)深入解析Java中ThreadLocal線程類的作用和用法.
    2016-05-05
  • Java多線程下解決數(shù)據(jù)安全問(wèn)題

    Java多線程下解決數(shù)據(jù)安全問(wèn)題

    這篇文章主要介紹了Java多線程下解決數(shù)據(jù)安全問(wèn)題,本文使用代碼進(jìn)行講解,可供大家學(xué)習(xí)參考
    2021-08-08
  • java實(shí)現(xiàn)文件上傳和下載

    java實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 用3個(gè)實(shí)例從原理到實(shí)戰(zhàn)講清楚Log4j史詩(shī)級(jí)漏洞

    用3個(gè)實(shí)例從原理到實(shí)戰(zhàn)講清楚Log4j史詩(shī)級(jí)漏洞

    最近應(yīng)該很多人都在關(guān)注著一個(gè)漏洞Apache Log4j 2遠(yuǎn)程代碼執(zhí)行,該漏洞一旦被攻擊者利用會(huì)造成嚴(yán)重危害,這篇文章主要給大家介紹了關(guān)于如何用3個(gè)實(shí)例從原理到實(shí)戰(zhàn)講清楚Log4j史詩(shī)級(jí)漏洞的相關(guān)資料,需要的朋友可以參考下
    2021-12-12

最新評(píng)論