本文主要是基于sun jdk 1.6 garbage collector(作者:畢玄)的整理與總結,原文請讀者在網上搜索。
1、java虛擬機運行時的數據區
2、常用的內存區域調節參數
-xms:初始堆大小,默認為物理內存的1/64(<1gb);默認(minheapfreeratio參數可以調整)空余堆內存小于40%%u65f6,jvm就會增大堆直到-xmx的最大限制
-xmx:最大堆大小,默認(maxheapfreeratio參數可以調整)空余堆內存大于70%%u65f6,jvm會減少堆直到 -xms的最小限制
-xmn:新生代的內存空間大小,注意:此處的大小是(eden 2 survivor space)。與jmap -heap中顯示的new gen是不同的。整個堆大小=新生代大小 老生代大小 永久代大小。
在保證堆大小不變的情況下,增大新生代后,將會減小老生代大小。此值對系統性能影響較大,sun官方推薦配置為整個堆的3/8。
-xx:survivorratio:新生代中eden區域與survivor區域的容量比值,默認值為8。兩個survivor區與一個eden區的比值為2:8,一個survivor區占整個年輕代的1/10。
-xss: 每個線程的堆棧大小。jdk5.0以后每個線程堆棧大小為1m,以前每個線程堆棧大小為256k。應根據應用的線程所需內存大小進行適當調整。在相同物理 內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。一般小的應用, 如果棧不是很深, 應該是128k夠用的,大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。和threadstacksize選項解釋很類似,官方文 檔似乎沒有解釋,在論壇中有這樣一句話:"-xss is translated in a vm flag named threadstacksize”一般設置這個值就可以了。
-xx:permsize:設置永久代(perm gen)初始值。默認值為物理內存的1/64。
-xx:maxpermsize:設置持久代最大值。物理內存的1/4。
3、內存分配方法
1)堆上分配 2)棧上分配 3)堆外分配(directbytebuffer或直接使用unsafe.allocatememory,但不推薦這種方式)
4、監控方法
1)系統程序運行時可通過jstat –gcutil來查看堆中各個內存區域的變化以及gc的工作狀態;
2)啟動時可添加-xx: printgcdetails –xloggc:<file>輸出到日志文件來查看gc的狀況;
3)jmap –heap可用于查看各個內存空間的大小;
5)斷代法可用gc匯總
一、新生代可用gc
1)串行gc(serial copying):client模式下默認gc方式,也可通過-xx: useserialgc來強制指定;默認情況下 eden、s0、s1的大小通過-xx:survivorratio來控制,默認為8,含義
為eden:s0的比例,啟動后可通過jmap –heap [pid]來查看。
默認情況下,僅在tlab或eden上分配,只有兩種情況下會在老生代分配:
1、需要分配的內存大小超過eden space大小;
2、在配置了pretenuresizethreshold的情況下,對象大小大于此值。
默認情況下,觸發minor gc時:
之前minor gc晉級到old的平均大小 < 老生代的剩余空間 < eden from survivor的使用空間。當handlepromotionfailure為true,則僅觸發minor gc;如為false,則觸發full gc。
默認情況下,新生代對象晉升到老生代的規則:
1、經歷多次minor gc仍存活的對象,可通過以下參數來控制:以maxtenuringthreshold值為準,默認為15。
2、to space放不下的,直接放入老生代;
2)并行gc(parnew):cms gc時默認采用,也可采用-xx: useparnewgc強制指定;垃圾回收的時候采用多線程的方式。
3)并行回收gc(parallel scavenge):server模式下默認的gc方式,也可采用-xx: useparallelgc強制指定;eden、s0、s1的大小可通過-xx:survivorratio來控制,但默認情況下
以-xx:initialsurivivorratio為準,此值默認為8,代表的為新生代大小 : s0,這點要特別注意。
默認情況下,當tlab、eden上分配都失敗時,判斷需要分配的內存大小是否 >= eden space的一半大小,如是就直接在老生代上分配;
默認情況下的垃圾回收規則:
1、在回收前ps gc會先檢測之前每次ps gc時,晉升到老生代的平均大小是否大于老生代的剩余空間,如大于則直接觸發full gc;
2、在回收后,也會按照上面的規則進行檢測。
默認情況下的新生代對象晉升到老生代的規則:
1、經歷多次minor gc仍存活的對象,可通過以下參數來控制:alwaystenure,默認false,表示只要minor gc時存活,就晉升到老生代;nevertenure,默認false,表示永不晉升到老生代;上面兩個都沒設置的情冴下,如 useadaptivesizepolicy,啟動時以initialtenuringthreshold值作為存活次數的閾值,在每次ps gc后會動態調整,如不使用useadaptivesizepolicy,則以maxtenuringthreshold為準。
2、to space放不下的,直接放入老生代。
在回收后,如useadaptivesizepolicy,ps gc會根據運行狀態動態調整eden、to以及tenuringthreshold的大小。如果不希望動態調整可設置 -xx:-useadaptivesizepolicy。如希望跟蹤每次的變化情況,可在啟勱參數上增加: printadaptivesizepolicy。
二、老生代可用gc
1、串行gc(serial copying):client方式下默認gc方式,可通過-xx: useserialgc強制指定。
觸發機制匯總:
1)old gen空間不足;
2)perm gen空間不足;
3)minor gc時的悲觀策略;
4)minor gc后在eden上分配內存仍然失敗;
5)執行heap dump時;
6)外部調用system.gc,可通過-xx: disableexplicitgc來禁止。
2、 并行回收gc(parallel scavenge): server模式下默認gc方式,可通過-xx: useparallelgc強制指定; 并行的線程數為當cpu core<=8 ? cpu core : 3 (cpu core*5)/8或通過-xx:parallelgcthreads=x來強制指定。如scavengebeforefullgc為true(默認 值),則先執行minor gc。
3、并行compacting:可通過-xx: useparalleloldgc強制指定。
4、并發cms:可通過-xx: useconcmarksweepgc來強制指定。并發的線程數默認為:( 并行gc線程數 3)/4,也可通過parallelcmsthreads指定。
觸發機制:
1、當老生代空間的使用到達一定比率時觸發;
hotspot v 1.6中默認為65%%uff0c可通過printcmsinitiationstatistics(此參數在v 1.5中不能用)來查看這個值到底是多少;可通過cmsinitiatingoccupancyfraction來強制指定,默認值并不是賦值在了這個值 上,是根據如下公式計算出來的: ((100 – minheapfreeratio) (double)(cmstriggerratio * minheapfreeratio) / 100.0)/ 100.0; 其中,minheapfreeratio默認值: 40 cmstriggerratio默認值: 80。
2、當perm gen采用cms收集且空間使用到一定比率時觸發;
perm gen采用cms收集需設置:-xx: cmsclassunloadingenabled hotspot v 1.6中默認為65%%uff1b可通過cmsinitiatingpermoccupancyfraction來強制指定,同樣,它是根據如下公式計算出來的: ((100 – minheapfreeratio) (double)(cmstriggerpermratio* minheapfreeratio) / 100.0)/ 100.0; 其中,minheapfreeratio默認值: 40 cmstriggerpermratio默認值
nginx實現一個域名配置多個laravel項目的方法示例山東棗莊高防云服務器哪些網站可以買云服務器配置王凱在省大數據中心鄭商所河南證監局河南銀保監局調研時強調 打造一流營商環境 構建良好金融生態阿里云個人買多少錢的服務器合適這個域名已經注冊過了怎么退回來說沒有注冊那網站優化?中,轉化率從哪些方面調整鏈路負載均衡其實可以這么做