关于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天, 内存没继续上升

你可能感兴趣的:(java)