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ū)大小.