欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java內(nèi)存分布實現(xiàn)代碼

 更新時間:2021年07月13日 11:19:40   作者:香菜聊游戲  
這篇文章主要介紹了淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、堆內(nèi)內(nèi)存

堆內(nèi)內(nèi)存分為三大部分,年輕代 , 老年代 和 元空間,所以 堆內(nèi)內(nèi)存 = 年輕代 + 老年代 + 元空間,下面細聊下三部分

1.1 年輕代-Young Generation

  • 存放的是new 生成的對象
  • 年輕代是為了盡可能快速的回收掉那些生命周期短的對象
  • Eden
    • 大部分對象在Eden區(qū)中生成
    • 當Eden區(qū)滿時,會做一次young gc, 依然存活的對象將被復制到Survivor區(qū), 當一個Survivor 區(qū)滿時, 此區(qū)的存活對象將被復制到另外一個Survivor區(qū)
  • Survivor(通常2個)
    • 當兩個 Survivor 區(qū) 都滿時, 從第一個Survivor 區(qū) 被復制過來 且 依舊存活的 對象,超過一定年齡的會被復制到 老年代(Tenured)
    • Survivor 的兩個區(qū)是對稱的, 沒有先后關(guān)系, 所有同一個區(qū)中可能同時存在從Eden復制過來的對象 和 從前一個 Survivor 復制過來的對象。
    • 把age大于-XX:MaxTenuringThreshold的對象晉升到老年代;(對象每在Survivor區(qū)熬過一次,其age就增加一歲);

1.2 老年代 (Old Generation)

  • 存放了在年輕代中經(jīng)歷了N次垃圾回收后仍存活的對象, 是一些生命周期較長的對象.
  • 存放那些創(chuàng)建的時候占用空間比較大的對象,這些對象不經(jīng)歷eden,直接進入老年代,大對象(大小大于-XX:PretenureSizeThreshold的對象)

1.3 元數(shù)據(jù)(Meta space)

  • 存放類的數(shù)據(jù)
  • 存放靜態(tài)文件, 如靜態(tài)類和方法等。持久代對垃圾回收沒有顯著影響, 但是有些應用可能動態(tài)生成或者調(diào)用一些class, 比如Hibernate, Mybatis 等, 此時需要設(shè)置一個較大的持久代空間來存放這些運行過程中新增的類。
  • 設(shè)置持久代大小參數(shù): -XX:MetaspaceSize, -XX:MaxMetaspaceSize

1.4 小結(jié)

圖片

1、默認參數(shù):

老年代占整個堆內(nèi)存的2/3

年輕代占整個內(nèi)存的1/3

Eden 區(qū)域占 整個年輕代的80%,F(xiàn)rom 和 To 兩個生存者區(qū)域各占10%

2、新老年代相關(guān)jvm參數(shù)

  • -XX:NewRatio 設(shè)置新老年代比例,如-XX:NewRatio=5 代表 新老年代比例為1:5,新生代占用堆內(nèi)存的1/6,老年代占用5/6;
  • -XX:SurvivorRatio 設(shè)置新生代中eden和兩個2個Survivo區(qū)域大小的比例,如-XX:SurvivorRatio=8,則eden:s1:s2=8:1:1,默認比例就是為8:1:1.

3、young GC發(fā)生在新生代中,F(xiàn)Ull GC 發(fā)生在整個堆空間中,一般是老年代空間不夠用就會出發(fā)FULL GC

二、堆外內(nèi)存

我們的游戲服務器使用的是netty,所以單說下netty,Netty的ByteBuffer采用DIRECT BUFFERS,使用堆外直接內(nèi)存進行Socket讀寫,不需要進行字節(jié)緩沖區(qū)的二次拷貝,堆外內(nèi)存的零拷貝.提升了效率。因為操作系統(tǒng)內(nèi)核直接把數(shù)據(jù)寫到堆外內(nèi)存里,不需要像普通API一樣,操作系統(tǒng)內(nèi)核緩存一份,程序讀的時候再復制一份到程序空間。

2.1 java中在堆外開辟內(nèi)存的方法有兩種

1.用DirectBufferByteBuffer.allocateDirect(size)

2.用JNI寫java的c/c++擴展,在擴展里不牽扯jvm自己向系統(tǒng)搞內(nèi)存出來。

2.2 使用堆外內(nèi)存的優(yōu)點

1.減少了垃圾回收因為垃圾回收會暫停其他的工作。

2.加快了復制的速度堆內(nèi)在flush到遠程時,會先復制到直接內(nèi)存(非堆內(nèi)存),然后在發(fā)送;而堆外內(nèi)存相當于省略掉了這個工作。

2.3堆外內(nèi)存的缺點

內(nèi)存難以控制,使用了堆外內(nèi)存就間接失去了JVM管理內(nèi)存的可行性,改由自己來管理,當發(fā)生內(nèi)存溢出時排查起來非常困難。

三、垃圾回收

3.1 垃圾回收(GC)

Minor GC

  • 一般當新對象生成并且在Eden申請空間失敗時就會觸發(fā)MinorGC, 對Eden區(qū)域進行GC, 清除非存活對象, 并且把尚存活的對象移動到Survivor區(qū), 然后整理兩個Survivor區(qū)。
  • 該方式的GC是對年輕代的Eden區(qū)進行,不會影響到年老代。
  • 由于大部分對象是從Eden區(qū)開始的, 所以Eden區(qū)的GC會很頻繁。

Major GC / Full GC

  • 老年代(Tenured) 被寫滿
  • 持久代(Permanent) 被寫滿
  • System.gc() 被顯示調(diào)用
  • 上一次GC之后Heap 的各域分配策略動態(tài)變化
  • 對整個堆進行整理。
  • 所消耗的時間較長, 所以要盡量減少 Full GC 的次數(shù)

出現(xiàn)Full GC經(jīng)常會伴隨至少一次的Minor GC(不是絕對,Parallel Sacvenge收集器就可以選擇設(shè)置Major GC策略);

Major GC速度一般比Minor GC慢10倍以上。

3.2 GC root

程序把所有的引用關(guān)系看作一張圖,從一個節(jié)點GC ROOT開始,尋找對應的引用節(jié)點,找到這個節(jié)點以后,繼續(xù)尋找這個節(jié)點的引用節(jié)點,當所有的引用節(jié)點尋找完畢之后,剩余的節(jié)點則被認為是沒有被引用到的節(jié)點,即無用的節(jié)點,是需要釋放內(nèi)存的對象。

java中可作為GC Root的對象有

1.虛擬機棧中引用的對象(本地變量表)

2.方法區(qū)中靜態(tài)屬性引用的對象

3方法區(qū)中常量引用的對象

4.本地方法棧中引用的對象(Native對象)

3.3常用垃圾回收器

垃圾收集器就是內(nèi)存回收的具體實現(xiàn)。下面介紹一下虛擬機提供的幾種垃圾收集器

Serial收集器(復制算法)

新生代單線程收集器,標記和清理都是單線程,優(yōu)點是簡單高效。

Serial Old收集器(標記-整理算法)

老年代單線程收集器,Serial收集器的老年代版本。

ParNew收集器(停止-復制算法) 

新生代收集器,可以認為是Serial收集器的多線程版本,在多核CPU環(huán)境下有著比Serial更好的表現(xiàn)。

Parallel Scavenge收集器(停止-復制算法)

并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般為99%, 吞吐量= 用戶線程時間/(用戶線程時間+GC線程時間)。適合后臺應用等對交互相應要求不高的場景。

Parallel Old收集器(停止-復制算法)

Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量優(yōu)先

CMS(Concurrent Mark Sweep)收集器(標記-清理算法)

高并發(fā)、低停頓,追求最短GC回收停頓時間,cpu占用比較高,響應時間快,停頓時間短,多核cpu 追求高響應時間的選擇

G1(Garbage-First)

現(xiàn)在最新的回收器,新生代和老年代通用

新生代收集器使用的收集器:Serial、PraNew、Parallel Scavenge

老年代收集器使用的收集器:Serial Old、Parallel OldCMS

我們線上服務器使用的是G1 收集器

四、總結(jié)

上面列舉了很多的內(nèi)容,但是需要記住的下面幾點就可以了

1、對象的遷移路徑:出生在Eden,然后在Survivor 區(qū)域來回遷移,遷移一次一次增加一次年齡,年齡太大的直接進入老年代

2、 Eden區(qū)域滿了 產(chǎn)生 minor Gc

老年代滿了產(chǎn)生 full gc

3、記住回收器是執(zhí)行g(shù)c 的,選擇最新的G1回收器就好了

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java原生動態(tài)生成驗證碼

    java原生動態(tài)生成驗證碼

    這篇文章主要為大家詳細介紹了java原生動態(tài)生成驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • SpringBoot自定義Starter與自動配置實現(xiàn)方法詳解

    SpringBoot自定義Starter與自動配置實現(xiàn)方法詳解

    在Spring Boot官網(wǎng)為了簡化我們的開發(fā),已經(jīng)提供了非常多場景的Starter來為我們使用,即便如此,也無法全面的滿足我們實際工作中的開發(fā)場景,這時我們就需要自定義實現(xiàn)定制化的Starter
    2023-02-02
  • Spring注入值到Bean的三種方式

    Spring注入值到Bean的三種方式

    這篇文章主要為大家詳細介紹了Spring注入值到Bean的三種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • IDEA2020如何打開Run Dashboard的方法步驟

    IDEA2020如何打開Run Dashboard的方法步驟

    這篇文章主要介紹了IDEA2020如何打開Run Dashboard的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • java后端實現(xiàn)信息分頁查詢的示例代碼

    java后端實現(xiàn)信息分頁查詢的示例代碼

    在一個頁面展示大量的用戶信息不便于觀看,因此就需要采用分頁展示的方法,本文就來為大家介紹一下java后端如何實現(xiàn)信息分頁查詢,需要的小伙伴可以參考下
    2023-11-11
  • Spring cloud alibaba之Gateway網(wǎng)關(guān)功能特征詳解

    Spring cloud alibaba之Gateway網(wǎng)關(guān)功能特征詳解

    spring cloud gateway是spring cloud推出的第二代網(wǎng)關(guān),是由WebFlux+Netty+Reactor實現(xiàn)的響應式的API網(wǎng)關(guān),它不能在傳統(tǒng)的servlet容器中工作,也不能構(gòu)建成war包,接下來通過本文給大家分享Spring cloud alibaba--Gateway網(wǎng)關(guān),需要的朋友可以參考下
    2021-08-08
  • maven將項目打包上傳到nexus私服的詳細教程

    maven將項目打包上傳到nexus私服的詳細教程

    這篇文章主要介紹了maven將項目打包上傳到nexus私服,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-07-07
  • JAVA WSIMPORT生成WEBSERVICE客戶端401認證過程圖解

    JAVA WSIMPORT生成WEBSERVICE客戶端401認證過程圖解

    這篇文章主要介紹了JAVA WSIMPORT生成WEBSERVICE客戶端401認證過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Map集合之HashMap的使用及說明

    Map集合之HashMap的使用及說明

    這篇文章主要介紹了Map集合之HashMap的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置

    Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置

    這篇文章主要介紹了Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05

最新評論