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

JVM對象創(chuàng)建和內(nèi)存分配原理解析

 更新時間:2020年02月26日 09:53:20   作者:crossoverJie  
這篇文章主要介紹了JVM對象創(chuàng)建和內(nèi)存分配原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

創(chuàng)建對象

當(dāng) JVM 收到一個 new 指令時,會檢查指令中的參數(shù)在常量池是否有這個符號的引用,還會檢查該類是否已經(jīng)被加載過了,如果沒有的話則要進行一次類加載。

接著就是分配內(nèi)存了,通常有兩種方式:

  • 指針碰撞
  • 空閑列表

使用指針碰撞的前提是堆內(nèi)存是完全工整的,用過的內(nèi)存和沒用的內(nèi)存各在一邊每次分配的時候只需要將指針向空閑內(nèi)存一方移動一段和內(nèi)存大小相等區(qū)域即可。

當(dāng)堆中已經(jīng)使用的內(nèi)存和未使用的內(nèi)存互相交錯時,指針碰撞的方式就行不通了,這時就需要采用空閑列表的方式。虛擬機會維護一個空閑的列表,用于記錄哪些內(nèi)存是可以進行分配的,分配時直接從可用內(nèi)存中直接分配即可。

堆中的內(nèi)存是否工整是有垃圾收集器來決定的,如果帶有壓縮功能的垃圾收集器就是采用指針碰撞的方式來進行內(nèi)存分配的。

分配內(nèi)存時也會出現(xiàn)并發(fā)問題:

這樣可以在創(chuàng)建對象的時候使用 CAS 這樣的樂觀鎖來保證。

也可以將內(nèi)存分配安排在每個線程獨有的空間進行,每個線程首先在堆內(nèi)存中分配一小塊內(nèi)存,稱為本地分配緩存(TLAB : Thread Local Allocation Buffer)。

分配內(nèi)存時,只需要在自己的分配緩存中分配即可,由于這個內(nèi)存區(qū)域是線程私有的,所以不會出現(xiàn)并發(fā)問題。

可以使用 -XX:+/-UseTLAB 參數(shù)來設(shè)定 JVM 是否開啟 TLAB 。

內(nèi)存分配之后需要對該對象進行設(shè)置,如對象頭。對象頭的一些應(yīng)用可以查看 Synchronize 關(guān)鍵字原理。

對象訪問

一個對象被創(chuàng)建之后自然是為了使用,在 Java 中是通過棧來引用堆內(nèi)存中的對象來進行操作的。

對于我們常用的 HotSpot 虛擬機來說,這樣引用關(guān)系是通過直接指針來關(guān)聯(lián)的。

這樣的好處就是:在 Java 里進行頻繁的對象訪問可以提升訪問速度(相對于使用句柄池來說)。

內(nèi)存分配

Eden 區(qū)分配

簡單的來說對象都是在堆內(nèi)存中分配的,往細一點看則是優(yōu)先在 Eden 區(qū)分配。

這里就涉及到堆內(nèi)存的劃分了,為了方便垃圾回收,JVM 將對內(nèi)存分為新生代和老年代。

而新生代中又會劃分為 Eden 區(qū),from Survivor、to Survivor 區(qū)。

其中 Eden 和 Survivor 區(qū)的比例默認(rèn)是 8:1:1,當(dāng)然也支持參數(shù)調(diào)整 -XX:SurvivorRatio=8。

當(dāng)在 Eden 區(qū)分配內(nèi)存不足時,則會發(fā)生 minorGC ,由于 Java 對象多數(shù)是朝生夕滅的特性,所以 minorGC 通常會比較頻繁,效率也比較高。

當(dāng)發(fā)生 minorGC 時,JVM 會根據(jù)復(fù)制算法將存活的對象拷貝到另一個未使用的 Survivor 區(qū),如果 Survivor 區(qū)內(nèi)存不足時,則會使用分配擔(dān)保策略將對象移動到老年代中。

談到 minorGC 時,就不得不提到 fullGC(majorGC) ,這是指發(fā)生在老年代的 GC ,不論是效率還是速度都比 minorGC 慢的多,回收時還會發(fā)生 stop the world 使程序發(fā)生停頓,所以應(yīng)當(dāng)盡量避免發(fā)生 fullGC 。

老年代分配

也有一些情況會導(dǎo)致對象直接在老年代分配,比如當(dāng)分配一個大對象時(大的數(shù)組,很長的字符串),由于 Eden 區(qū)沒有足夠大的連續(xù)空間來分配時,會導(dǎo)致提前觸發(fā)一次 GC,所以盡量別頻繁的創(chuàng)建大對象。

因此 JVM 會根據(jù)一個閾值來判斷大于該閾值對象直接分配到老年代,這樣可以避免在新生代頻繁的發(fā)生 GC。

對于一些在新生代的老對象 JVM 也會根據(jù)某種機制移動到老年代中。

JVM 是根據(jù)記錄對象年齡的方式來判斷該對象是否應(yīng)該移動到老年代,根據(jù)新生代的復(fù)制算法,當(dāng)一個對象被移動到 Survivor 區(qū)之后 JVM 就給該對象的年齡記為1,每當(dāng)熬過一次 minorGC 后對象的年齡就 +1 ,直到達到閾值(默認(rèn)為15)就移動到老年代中。

可以使用 -XX:MaxTenuringThreshold=15 來配置這個閾值。

總結(jié)

雖說這些內(nèi)容略顯枯燥,但當(dāng)應(yīng)用發(fā)生不正常的 GC 時,可以方便更快的定位問題。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springBoot Maven 剔除無用的jar引用問題記錄

    springBoot Maven 剔除無用的jar引用問題記錄

    這篇文章主要介紹了springBoot Maven 剔除無用的jar引用問題記錄,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法

    SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法

    本篇文章主要介紹了SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法,具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04
  • Java常用時間工具類總結(jié)(珍藏版)

    Java常用時間工具類總結(jié)(珍藏版)

    這篇文章主要為大家詳細介紹了Java中一些常用時間工具類的使用示例代碼,文中的代碼簡潔易懂,對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-07-07
  • Mybatis?Lombok使用方法與復(fù)雜查詢介紹

    Mybatis?Lombok使用方法與復(fù)雜查詢介紹

    Lombok是一種Java實用工具,可用來幫助開發(fā)人員消除Java的冗長,尤其是對于簡單的Java對象(POJO),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Java EE項目中的異常處理總結(jié)(一篇不得不看的文章)

    Java EE項目中的異常處理總結(jié)(一篇不得不看的文章)

    什么是異常?運行時發(fā)生的可被捕獲和處理的錯誤。這篇文章主要介紹了Java EE項目中的異常處理總結(jié),有需要的可以了解一下。
    2016-11-11
  • Java中volatile防止指令重排

    Java中volatile防止指令重排

    volatile可以防止指令重排,在多線程環(huán)境下有時候我們需要使用volatile來防止指令重排,來保證代碼運行后數(shù)據(jù)的準(zhǔn)確性,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 在Spring中使用Knife4j進行API文檔生成與管理的操作方法

    在Spring中使用Knife4j進行API文檔生成與管理的操作方法

    Knife4j 是為Java MVC 框架(如Spring Boot、Spring MVC等)集成 Swagger 生成 API 文檔的增強解決方案,它基于 Swagger 的核心功能,通過定制化的前端界面和一些額外的特性,本文介紹了在Spring中使用Knife4j進行API文檔生成與管理的操作方法,需要的朋友可以參考下
    2024-12-12
  • SpringBoot集成MyBatis的多種方式

    SpringBoot集成MyBatis的多種方式

    本文深入解析了Spring Boot集成MyBatis的多種方式,包括XML配置、注解配置以及MyBatis的動態(tài)SQL等,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Spring web集成rabbitmq代碼實例

    Spring web集成rabbitmq代碼實例

    這篇文章主要介紹了Spring web集成rabbitmq代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Quartz集群原理以及配置應(yīng)用的方法詳解

    Quartz集群原理以及配置應(yīng)用的方法詳解

    Quartz是Java領(lǐng)域最著名的開源任務(wù)調(diào)度工具。Quartz提供了極為廣泛的特性如持久化任務(wù),集群和分布式任務(wù)等,下面這篇文章主要給大家介紹了關(guān)于Quartz集群原理以及配置應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2018-05-05

最新評論

甘德县| 兴文县| 沅陵县| 新丰县| 左贡县| 灵川县| 阳城县| 灵武市| 柳河县| 新民市| 齐河县| 长岭县| 从化市| 大同市| 鹤峰县| 德格县| 和顺县| 剑川县| 承德市| 宁城县| 吴桥县| 内黄县| 磐安县| 留坝县| 高要市| 行唐县| 红安县| 枣庄市| 新河县| 松原市| 娱乐| 蒲江县| 秀山| 舒兰市| 彰武县| 珲春市| 涪陵区| 宁河县| 师宗县| 澄迈县| 克拉玛依市|