服务器很久前出现了这个问题,
网上查了一大堆
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天, 内存没继续上升