服务器很久前出现了这个问题,
网上查了一大堆
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游戏服务器中遇到的内存问题,包括堆内存、堆外内存的管理,以及如何通过调整JVM参数、引入tcmalloc库和更换JDK版本来解决内存持续增长的难题。
1284

被折叠的 条评论
为什么被折叠?



