分析線上JVM內存佔比高問題

推薦公衆號

彩蛋哦!!!(或者公衆號內點擊網賺獲取彩蛋)
程序員探索之路

前言

今天老大突然告訴我說 讓我搞一下測試服務器 ???WHAT 服務器不是一直都是運維搞的嗎?原來運維發現測試服務器越來越卡,查看了佔用內存的進程,發現竟然是幾個後臺應用,嗯???其中一個後臺應用我是知道的,是用來做數據處理的,對象基本上都是 朝生夕死,內存應該丟會被回收掉,當然內存會有峯值但是估計最多也就1G,但是運維告訴我這個應用平常的內存佔用就是3G。這種情況一般就是內存泄漏了

分析過程

是否存在內存泄漏

把堆鏡像轉出來分析一下(怎麼分析的下次再說),分析下來是有很多對象存在內存中,但是查找相關代碼並沒有內存泄漏情況。這就令人費解了,正當發愁時忽然想到之前遇到一種情況,沒有內存泄漏但是年輕代佔用異常高,最大堆沒有限制(64位默認8G)

分析內存使用情況

在這裏插入圖片描述
從上面可以看到總堆大小8G默認的堆大小,eden區2.5G,使用情況2.3G,使用率95.3% 這。。。。年輕代中一般朝生夕死過一段時間就會被GC掉,不會佔用很大的內存空間(理解的不深,如果有更好的意見請加微信交流15938289083)。運維也不知道之前的參數,這隻能慢慢調整了不能一下設置的太小,暫時先設置一個最大堆-Xmx2048M 年輕代:年老代=1:2 eden:from space:to space = 8:1:1,以後根據內存使用曲線個GC情況進行調整。更改完參數之後再看線上內存的確好了不少,但是以後還需要根據實際使用情況調整。