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

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

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

創(chuàng)建對象

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

接著就是分配內存了,通常有兩種方式:

  • 指針碰撞
  • 空閑列表

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

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

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

分配內存時也會出現并發(fā)問題:

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

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

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

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

內存分配之后需要對該對象進行設置,如對象頭。對象頭的一些應用可以查看 Synchronize 關鍵字原理。

對象訪問

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

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

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

內存分配

Eden 區(qū)分配

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

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

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

其中 Eden 和 Survivor 區(qū)的比例默認是 8:1:1,當然也支持參數調整 -XX:SurvivorRatio=8。

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

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

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

老年代分配

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

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

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

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

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

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java實現AI五子棋游戲的示例代碼

    Java實現AI五子棋游戲的示例代碼

    本文只是介紹五子棋AI的實現,最終的成品只是一個?AI?接口,并不包括?GUI,且不依賴?GUI,文中的示例代碼講解詳細,感興趣的可以嘗試一下
    2022-09-09
  • mybatis-plus插入一條數據,獲取插入數據自動生成的主鍵問題

    mybatis-plus插入一條數據,獲取插入數據自動生成的主鍵問題

    這篇文章主要介紹了mybatis-plus插入一條數據,獲取插入數據自動生成的主鍵問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java線程創(chuàng)建與Thread類的使用方法

    Java線程創(chuàng)建與Thread類的使用方法

    這篇文章主要介紹了Java線程創(chuàng)建與Thread類的使用方法,圍繞java多線程中Thread類的使用以及有關線程對象創(chuàng)建和常用方法的相關資料展開詳細內容,具有一定的參考價值,需要的下伙伴可以參考一下
    2022-06-06
  • TF-IDF理解及其Java實現代碼實例

    TF-IDF理解及其Java實現代碼實例

    這篇文章主要介紹了TF-IDF理解及其Java實現代碼實例,簡單介紹了tfidf算法及其相應公式,然后分享了Java實現代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java 數據庫連接池 Tomcat介紹

    Java 數據庫連接池 Tomcat介紹

    這篇文章主要給大家分享了 Java 數據庫連接池 Tomcat介紹,omcat 是一個小型的輕量級應用服務器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調試JSP 程序的首選。下面來看看文章內容的詳細介紹吧
    2021-11-11
  • Java中HashMap和TreeMap的區(qū)別深入理解

    Java中HashMap和TreeMap的區(qū)別深入理解

    首先介紹一下什么是Map。在數組中我們是通過數組下標來對其內容索引的,而在Map中我們通過對象來對對象進行索引,用來索引的對象叫做key,其對應的對象叫做value
    2012-12-12
  • Spring?Boot?基于?SCRAM?認證集成?Kafka?的過程詳解

    Spring?Boot?基于?SCRAM?認證集成?Kafka?的過程詳解

    在本篇文章中,我們將探討如何在?Spring?Boot?應用中集成?Kafka?并使用?SCRAM?認證機制進行安全連接,并實現動態(tài)創(chuàng)建賬號、ACL?權限、Topic,以及生產者和消費者等操作,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 一文講解如何優(yōu)雅的調試jar包

    一文講解如何優(yōu)雅的調試jar包

    在現實開發(fā)過程中,現場環(huán)境永遠比開發(fā)環(huán)境復雜,下面這篇文章主要給大家介紹了關于如何優(yōu)雅的調試jar包的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Java中的Comparable和Comparator接口

    Java中的Comparable和Comparator接口

    這篇文章主要介紹了Java中的Comparable和Comparator接口,文章圍繞主題展開詳細的內容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Ubuntu16.04安裝部署solr7的圖文詳細教程

    Ubuntu16.04安裝部署solr7的圖文詳細教程

    這篇文章主要為大家詳細介紹了Ubuntu16.04安裝部署solr7的圖文詳細教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論