天天看點

關于linux下java程序記憶體占用大于Xmx設定,且一直提升

伺服器很久前出現了這個問題, 

網上查了一大堆

1,java程序的記憶體占用大概是 堆記憶體+堆外記憶體(DirectBufferSize)+JVM的一些占用

2, -Xmx設定的是堆記憶體, 如果不具體指定 -XX:MaxDirectMemorySize(堆外記憶體),也相當于設定了XX:MaxDirectMemorySize

3,可以用pmap -x pid來檢視具體記憶體使用, 用/proc/{pid}/smaps 來更詳細檢視

不過,發現用-XX:MaxDirectMemorySize設定了之後, 還是沒效果

繼續查,發現有glibc的問題, 需要安裝tcmalloc,在啟動參數裡面增加 export LD_PRELOAD=/usr/local/lib/libtcmalloc.so(根據你的安裝位置),  但是隻解決了虛拟記憶體高,實際記憶體還在增加

https://www.sohu.com/a/200462136_505827

最終發現, jdk版本 1.7.80 等幾個版本, 有一些

java.util.zip.Deflate.init()

 方面的記憶體不釋放的bug(我也沒仔細排查),

用jdk 1.7.76替換之, 運作遊戲伺服器7天, 記憶體沒繼續上升