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

再也不用怕! 讓你徹底搞明白Java內(nèi)存分布

 更新時(shí)間:2021年06月06日 10:58:09   作者:香菜聊游戲  
做Java的大都沒有c++ 的那種分配內(nèi)存的煩惱,因?yàn)镴ava 幫我們管理內(nèi)存,但是這并不代表我們不需要了解Java的內(nèi)存結(jié)構(gòu),因?yàn)榫€上經(jīng)常出現(xiàn)內(nèi)存的問題,今天聊一下內(nèi)存的問題,需要的朋友可以參考下

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

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

1.1 年輕代-Young Generation

存放的是new 生成的對象

年輕代是為了盡可能快速的回收掉那些生命周期短的對象

Eden

  • 大部分對象在Eden區(qū)中生成
  • 當(dāng)Eden區(qū)滿時(shí),會(huì)做一次young gc, 依然存活的對象將被復(fù)制到Survivor區(qū), 當(dāng)一個(gè)Survivor 區(qū)滿時(shí), 此區(qū)的存活對象將被復(fù)制到另外一個(gè)Survivor區(qū)

Survivor(通常2個(gè))

  • 當(dāng)兩個(gè) Survivor 區(qū) 都滿時(shí), 從第一個(gè)Survivor 區(qū) 被復(fù)制過來 且 依舊存活的 對象,超過一定年齡的會(huì)被復(fù)制到 老年代(Tenured)
  • Survivor 的兩個(gè)區(qū)是對稱的, 沒有先后關(guān)系, 所有同一個(gè)區(qū)中可能同時(shí)存在從Eden復(fù)制過來的對象 和 從前一個(gè) Survivor 復(fù)制過來的對象。
  • 把a(bǔ)ge大于-XX:MaxTenuringThreshold的對象晉升到老年代;(對象每在Survivor區(qū)熬過一次,其age就增加一歲);

1.2 老年代 (Old Generation)

存放了在年輕代中經(jīng)歷了N次垃圾回收后仍存活的對象, 是一些生命周期較長的對象.

存放那些創(chuàng)建的時(shí)候占用空間比較大的對象,這些對象不經(jīng)歷eden,直接進(jìn)入老年代,大對象(大小大于-XX:PretenureSizeThreshold的對象)

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

存放類的數(shù)據(jù)

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

設(shè)置持久代大小參數(shù): -XX:MetaspaceSize, -XX:MaxMetaspaceSize

1.4 總結(jié)

圖片

1、默認(rèn)參數(shù):

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

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

Eden 區(qū)域占 整個(gè)年輕代的80%,F(xiàn)rom 和 To 兩個(gè)生存者區(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和兩個(gè)2個(gè)Survivo區(qū)域大小的比例,如-XX:SurvivorRatio=8,則eden:s1:s2=8:1:1,默認(rèn)比例就是為8:1:1.

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

二、堆外內(nèi)存

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

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

1.用DirectBufferByteBuffer.allocateDirect(size)

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

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

1.減少了垃圾回收因?yàn)槔厥諘?huì)暫停其他的工作。

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

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

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

三、垃圾回收

3.1 垃圾回收(GC)

Minor GC

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

Major GC / Full GC

  • 老年代(Tenured) 被寫滿
  • 持久代(Permanent) 被寫滿
  • System.gc() 被顯示調(diào)用
  • 上一次GC之后Heap 的各域分配策略動(dòng)態(tài)變化
  • 對整個(gè)堆進(jìn)行整理。
  • 所消耗的時(shí)間較長, 所以要盡量減少 Full GC 的次數(shù)
  • 出現(xiàn)Full GC經(jīng)常會(huì)伴隨至少一次的Minor GC(不是絕對,Parallel Sacvenge收集器就可以選擇設(shè)置Major GC策略);

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

3.2 GC root

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

java中可作為GC Root的對象有

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

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

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

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

3.3常用垃圾回收器

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

Serial收集器(復(fù)制算法)

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

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

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

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

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

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

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

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

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

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

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

G1(Garbage-First)

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

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

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

我們線上服務(wù)器使用的是G1 收集器

四、總結(jié)

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

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

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

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

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

到此這篇關(guān)于再也不用怕! 讓你徹底搞明白Java內(nèi)存分布的文章就介紹到這了,更多相關(guān)Java內(nèi)存分布內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解Java多線程與并發(fā)編程

    深入理解Java多線程與并發(fā)編程

    這篇文章主要介紹了Java多線程與并發(fā)編程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java關(guān)鍵字instanceof的兩種用法實(shí)例

    Java關(guān)鍵字instanceof的兩種用法實(shí)例

    這篇文章主要介紹了Java關(guān)鍵字instanceof的兩種用法實(shí)例,本文給出了instanceof關(guān)鍵字用于判斷一個(gè)引用類型變量所指向的對象是否是一個(gè)類(或接口、抽象類、父類)及用于數(shù)組比較,需要的朋友可以參考下
    2015-03-03
  • Springboot 整合 Dubbo/ZooKeeper 實(shí)現(xiàn) SOA 案例解析

    Springboot 整合 Dubbo/ZooKeeper 實(shí)現(xiàn) SOA 案例解析

    這篇文章主要介紹了Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例,需要的朋友可以參考下
    2017-11-11
  • SpringBoot整合tkMapper的方法

    SpringBoot整合tkMapper的方法

    項(xiàng)目使用SpringBoot2.0,H2數(shù)據(jù)庫,使用了?Lombok?簡化代碼,下面是本人使用SpringBoot整合tkMapper的一個(gè)小demo,記錄下來本人在此處踩得坑
    2022-11-11
  • Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作示例

    Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作,結(jié)合實(shí)例形式分析了靜態(tài)工廠方法創(chuàng)建Bean的相關(guān)實(shí)現(xiàn)步驟與操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • 散列算法與散列碼(實(shí)例講解)

    散列算法與散列碼(實(shí)例講解)

    下面小編就為大家?guī)硪黄⒘兴惴ㄅc散列碼(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 基于JAVA代碼 獲取手機(jī)基本信息(本機(jī)號碼,SDK版本,系統(tǒng)版本,手機(jī)型號)

    基于JAVA代碼 獲取手機(jī)基本信息(本機(jī)號碼,SDK版本,系統(tǒng)版本,手機(jī)型號)

    本文給大家介紹基于java代碼獲取手機(jī)基本信息,包括獲取電話管理對象、獲取手機(jī)號碼、獲取手機(jī)型號、獲取SDK版本、獲取系統(tǒng)版本等相關(guān)信息,對本文感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloud Eureka 提供者及調(diào)用者的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringCloud升級2020.0.x版之OpenFeign簡介與使用實(shí)現(xiàn)思路

    SpringCloud升級2020.0.x版之OpenFeign簡介與使用實(shí)現(xiàn)思路

    在微服務(wù)系統(tǒng)中,我們經(jīng)常會(huì)進(jìn)行 RPC 調(diào)用。在 Spring Cloud 體系中,RPC 調(diào)用一般就是 HTTP 協(xié)議的調(diào)用。對于每次調(diào)用,都要經(jīng)過一系列詳細(xì)步驟,接下來通過本文給大家介紹SpringCloud OpenFeign簡介與使用,感興趣的朋友一起看看吧
    2021-10-10
  • Springboot登錄驗(yàn)證的統(tǒng)一攔截處理的實(shí)現(xiàn)

    Springboot登錄驗(yàn)證的統(tǒng)一攔截處理的實(shí)現(xiàn)

    如果不進(jìn)行統(tǒng)一的攔截處理,每次用戶請求你都要去進(jìn)行用戶的信息驗(yàn)證,所以本文主要介紹了Springboot登錄驗(yàn)證的統(tǒng)一攔截處理的實(shí)現(xiàn),感興趣的可以了解一下,感興趣的可以了解一下
    2023-09-09

最新評論