摘要:現象登入生產環境,使用命令因為這時候并沒有打的,所以只能觀察現象。其他的可以根據這個類推,是內純的占用量。
前言
我們的游戲上線之初,經常有玩家反饋卡,或者有網絡延遲等現象,造成用戶流失等現象,這時候我就想到是不是可能是之前的jvm配置有問題,或者存在內存泄露等問題。
現象
登入生產環境,使用命令,因為這時候并沒有打gc的log,所以只能觀察現象。
jstat -gcutil 27084 250 20
查看gc狀態
說明:
S0 | S1 | E | O | P | YGC | YGCT | FGC | FGCT | GCT |
---|---|---|---|---|---|---|---|---|---|
54.62 | 0.00 | 42.87 | 43.52 | 86.24 | 1792 | 5.093 | 33 | 7.670 | 12.763 |
S0:新生代的susvivor0區,空間使用率為54..62%
S1:新生代的susvivor1區,空間使用率為0.00%(因為還沒有執行第二次minor收集)
E:eden區,空間使用率42.87%
O:舊生代,空間使用率43.52%
P:持久帶,空間使用率86.24%
YGC:minor gc執行次數1792次
YGCT:minor gc耗費的時間5.093毫秒
FGC:full gc執行次數33
FGCT:full gc耗費的時間7.670毫秒
GCT:gc耗費的總時間12.763毫秒
發現其實主要是full gc頻率過高,為什么會導致這個原因呢,我首先想到的是是不是老生代分配的過低,就著手分配老生代的比例
然而并沒有解決這個問題,發現YGC持續升高,而FGC也會逐漸上來,暫時解決了問題的表象而已。
解決問題 首先看一下該jvm使用內存的情況使用命令jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。
發現問題看了一下jvm內存分配情況,發現一共新生代只分配了50M左右,發現原來之前使用的啟動腳本并沒有設置jvm啟動參數
解決問題先把Jvm參數調整,gc log文件夾設置
JAVA_OPTS="-Xms2048m -Xmx2048m -XX:PermSize=64m -XX:MaxPermSize=256m -verbose:gc -Xloggc:/home/admin/logs/gc.log"
生產環境Java應用的jvm參數Xms與Xmx保持一致,避免因所使用的Java堆內存不夠導致頻繁full gc以及full gc中因動態調節Java堆大小而耗費延長其周期。
查看下圖,FGC已經明顯下降到正常水平
學好JVM可以從JVM參數開始:
參數名稱 | 含義 默認值 |
---|---|
-Xms | 初始堆大小 物理內存的1/64(<1GB) 默認(MinHeapFreeRatio參數可以調整)空余堆內存小于40%時,JVM就會增大堆直到-Xmx的最大限制. |
-Xmx | 最大堆大小 物理內存的1/4(<1GB) 默認(MaxHeapFreeRatio參數可以調整)空余堆內存大于70%時,JVM會減少堆直到 -Xms的最小限制 |
-Xmn | 年輕代大小(1.4or lator)注意:此處的大小是(eden+ 2 survivor space).與jmap -heap中顯示的New gen是不同的。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小.增大年輕代后,將會減小年老代大小.此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8 |
-XX:NewSize | 設置年輕代大小(for 1.3/1.4) |
-XX:MaxNewSize | 年輕代最大值(for 1.3/1.4) |
-XX:PermSize | 設置持久代(perm gen)初始值 物理內存的1/64 |
-XX:MaxPermSize | 設置持久代最大值 物理內存的1/4 |
-Xss | 每個線程的堆棧大小,JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K.更具應用的線程所需內存大小進行 調整.在相同物理內存下,減小這個值能生成更多的線程.但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右,一般小的應用, 如果棧不是很深, 應該是128k夠用的 大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。(校長)和threadstacksize選項解釋很類似,官方文檔似乎沒有解釋,在論壇中有這樣一句話:"”-Xss is translated in a VM flag named ThreadStackSize”一般設置這個值就可以了。 |
-XX:ThreadStackSize | Thread Stack Size (0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.] |
-XX:NewRatio | 年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代) -XX:NewRatio=4表示年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5Xms=Xmx并且設置了Xmn的情況下,該參數不需要進行設置。 |
-XX:SurvivorRatio | Eden區與Survivor區的大小比值 設置為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個年輕代的1/10 |
-XX:LargePageSizeInBytes | 內存頁的大小不可設置過大, 會影響Perm的大小 =128m |
-XX:+UseFastAccessorMethods | 原始類型的快速優化 |
-XX:+DisableExplicitGC | 關閉System.gc() 這個參數需要嚴格的測試 |
-XX:MaxTenuringThreshold | 垃圾最大年齡 如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代. 對于年老代比較多的應用,可以提高效率.如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活 時間,增加在年輕代即被回收的概率,該參數只有在串行GC時才有效. |
-XX:+AggressiveOpts | 加快編譯 |
-XX:+UseBiasedLocking | 鎖機制的性能改善 |
-Xnoclassgc | 禁用垃圾回收 |
-XX:SoftRefLRUPolicyMSPerMB | 每兆堆空閑空間中SoftReference的存活時間 1s softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap |
-XX:PretenureSizeThreshold | 對象超過多大是直接在舊生代分配 0 單位字節 新生代采用Parallel Scavenge GC時無效,另一種直接在舊生代分配的情況是大的數組對象,且數組中無外部引用對象. |
-XX:TLABWasteTargetPercent | TLAB占eden區的百分比 1% |
-XX:+CollectGen0First | FullGC時是否先YGC false |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66303.html
摘要:這是多處理器系統中,調度器用來分散任務到不同的機制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調優思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經驗, 那肯定就更好了 業務背景 框架及相應環境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...
摘要:這是多處理器系統中,調度器用來分散任務到不同的機制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調優思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經驗, 那肯定就更好了 業務背景 框架及相應環境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...
摘要:什么是內存溢出內存溢出是指,程序創建對象需要內存,但是卻沒有內存可用了,內存就溢出了。使用命令查看個數輸入后,按診斷是文件在服務端沒讀取到,還是內存溢出。無耐,阿里云學生機配置不好,只能稍微修改一點,再將文件切割為小文件上傳了參數請參考 1、什么是內存泄漏內存泄漏是指,有未被釋放的java對象,一直停留在內存中。GCRoot 無法追蹤到此對象,導致此對象無法被回收。 2、什么是內存溢出...
摘要:為了一探究竟,于是開啟了這次應用性能調優之旅。使用即時編譯器和都能輕輕松松的讓你的應用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結。在經歷了調優過程踩的很多坑之后,我們最終完善并實施了初步的性能測試方案,通過真實的測試數據歸納出了 Laravel 開發過程中的一些實踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫的應用程序響應有點慢、20幾個并...
摘要:首先先解讀下這個報警內容,原因活躍線程數過多,是監聽的端口號用來獲取虛擬機各項信息,代表著此時的線程數,是設置的報警閾值。 前言 前天,一位21世紀的好好青年正在工位上默念社會主義大法好的時候,釘釘上又報警了(公司項目接入了open-faclon監控,指標不正常會報警給釘釘的機器人),無奈默默流淚揮手告別社會主義大法開始定位線上問題。 報警內容 首先我們先來看下報警信息,為防止泄露公...
閱讀 2902·2021-11-25 09:43
閱讀 2320·2021-11-24 09:39
閱讀 2708·2021-09-23 11:51
閱讀 1400·2021-09-07 10:11
閱讀 1449·2019-08-27 10:52
閱讀 1929·2019-08-26 12:13
閱讀 3356·2019-08-26 11:57
閱讀 1393·2019-08-26 11:31