JVM 內(nèi)存模型以及jmap的簡單使用

JVM 內(nèi)存模型

從內(nèi)存申請方式劃分

1. 棧 stack

方法區(qū) method area

虛擬機(jī)棧 vm stack

本地方法棧 native stack

2.? 堆 heap (內(nèi)存申請方式)

堆 heap (這里的堆指的是存儲(chǔ)對(duì)象的區(qū)域)

程序計(jì)數(shù)器 program counter register?

3. 堆劃分

1. 年輕代(young gem)

年輕代分為1個(gè)eden space 和2個(gè)survivor space

2. 老年代(old gem)


線程共享

線程共享: 方法區(qū),堆

線程私有:虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器



數(shù)據(jù)存儲(chǔ)

1. 靜態(tài)全局變量,方法:方法區(qū)(nethod)

2. 對(duì)象:堆(heap)

3. java局部變量:虛擬機(jī)棧.(vm stack)

4. 本地方法變量:本地方法棧(native stack)

5. 線程執(zhí)行相關(guān)數(shù)據(jù):程序計(jì)數(shù)器(program counter register)

參考:jvm 全面理解


jmap?

jmap 必須安裝open-jdk-debug ,執(zhí)行時(shí)候需要用到root權(quán)限.

生產(chǎn)環(huán)境對(duì)jmap -dump ,histo:live ,permstat(1.8 clstats) 慎用,會(huì)觸發(fā)應(yīng)用暫停.

jmap -heap pid?

查看對(duì)應(yīng)pid的堆信息

jmap -dump:file=xxx.dump pid?

dump對(duì)應(yīng)pid堆信息

jmap -clstats?

查看類加載信息



jvm 參數(shù)設(shè)定

-server//服務(wù)器模式

-Xms4g //JVM初始分配的堆內(nèi)存,一般和Xmx配置成一樣以避免每次gc后JVM重新分配內(nèi)存。

-Xmx4g //JVM最大允許分配的堆內(nèi)存,按需分配

-Xmn256m //年輕代內(nèi)存大小,整個(gè)JVM內(nèi)存=年輕代 + 年老代 + 持久代?

-Xss512k //設(shè)置每個(gè)線程的堆棧大小

-XX:+DisableExplicitGC //忽略手動(dòng)調(diào)用GC, System.gc()的調(diào)用就會(huì)變成一個(gè)空調(diào)用,完全不觸發(fā)GC

-XX:+UseConcMarkSweepGC //并發(fā)標(biāo)記清除(CMS)收集器

-XX:+CMSParallelRemarkEnabled //降低標(biāo)記停頓

-XX:LargePageSizeInBytes=128m //內(nèi)存頁的大小

-XX:+UseFastAccessorMethods //原始類型的快速優(yōu)化

-XX:+UseCMSInitiatingOccupancyOnly //使用手動(dòng)定義初始化定義開始CMS收集

-XX:CMSInitiatingOccupancyFraction=70 //使用cms作為垃圾回收使用70%后開始CMS收集

-Duser.timezone=GMT+8 //設(shè)定GMT區(qū)域,避免CentOS坑爹的時(shí)區(qū)設(shè)置

-XX:MetaspaceSize //觸發(fā)GC的元數(shù)據(jù)空間閾值,并非初始值.

-XX:InitialBootClassLoaderMetaspaceSize=256m //元數(shù)據(jù)初始值

-XX:NewRatio=4:設(shè)置年輕代(包括Eden和兩個(gè)Survivor區(qū))與年老代的比值(除去持久代).設(shè)置為4,則年輕代與年老代所占比值為1:4,年輕代占整個(gè)堆棧的1/5

-XX:SurvivorRatio=4:設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值.設(shè)置為4,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:4,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/6


這里看起來很多,其實(shí)并沒有多少的.
首先,配置堆的最小值:-Xms4g,最大值:-Xmx4g;
然后配置年輕代:-Xmn256m 或配置比例:-XX:NewRatio=4;
再配置survivor區(qū)比例:-XX:SurvivorRatio=4;
最后可能需要配置每個(gè)線程堆大小:-Xss512k.

到這里,年輕代,內(nèi)存配置完成.持久帶(元數(shù)據(jù)) 一般不需要配置,默認(rèn)20m ,最大沒限制.其他都是一些配置垃圾收集器,這部分基本沒什么修改的,一般eden區(qū)采用標(biāo)記清除算法,survivor復(fù)制-清除算法之類的.copy就行.主要需要調(diào)整的就是eden ,survivor,調(diào)整這里,可以直接擴(kuò)大年輕代.線程堆大小可能也需要調(diào)整.元數(shù)據(jù)區(qū)基本沒什么好修改的.基本就是調(diào)大內(nèi)存,調(diào)好年輕代大小,eden區(qū)大小.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容