运行demoServer后,多次请求接口,java程序内存占用会一直升高,且没有下降的趋势,想请教一下大佬是否存在内存泄露?
Closed this issue · 13 comments
hi,请在内存占用高的情况,使用jmap命令dump内存布局文件:
jmap -dump:format=b,file=/path/to/savefile.bin pid
其中pid是Linux中demo server的进程号
之后你可以将这个.bin
文件压缩一下。请通过百度云盘等方式传给我内存dump文件,便于我们分析是否存在内存泄漏
前面发的dump是我只运行了半个小时的,如果挂上一周的话内存占用会到将近20个g,从活动监视器上面看,随着接口调用次数的增加,线程和端口的数量会一直增加,没有下降的情况,我重新dump了一下,这次是挂了一天的,内存占用已经5个G了,麻烦
@iinti 大佬在看下,另外附上dump文件
这个程序我没有关,打算今天再挂一天,等他内存涨上去,到时候我再更新一个dump文件和内存占用截图
hi,你这个计数应该是不准确的。我看实际上堆内存依然只有6M,看起来应该是你的macos的主机本身内存资源充足,其内存资源在操作系统不会及时GC。但是程序内部占用内存只有700M。你的dump文件整个只有700M的大小,一般来说不会是内存泄漏的表现。内存泄漏正常dump文件都是几个G的大小
hi,文件过期了。
文件太小了,才700M。堆空间肯定是没有泄漏的。我之前处理过很多次netty网络程序的泄漏问题,只要出现异常问题,dump文件基本立马看出问题点。
sekiro依赖netty,会使用堆外内存,即由c++分配内存空间,不被java GC之间管理,但是你的dump文件中显示堆外内存只有465个,本身考虑内存复用这些堆外内存就不会被清理。量级也远远达不到内存泄漏的地步
你这个17G是虚拟空间,应该是mac-os的机制,所有访问过的虚拟空间地址可能都会被缓存,但是实际上在malloc层面已经被free了。
java本身是有内存保护机制的,默认情况下jvm控制的可分配内存范围是 物理机器内存的1/64 到 1/4 之间,超过配额jvm本身就会直接crash。不可能达到需要操作系统干预回收的地步。
另外,sekiro已经在公司的环境中运行了好些年,除非命中特殊条件的bug,理论上不至于出现这种明显的问题。
** 请使用新版本的代码,为避免问题沟通基础讨论问题,原则上老版本代码不做问题回复。**
** 如果你依然对本文保有疑问,建议选择一台Linux的主机运行sekiro,应该不会有这个表现 **
好的,感谢大佬的分析,我先更换成新版本试试,后续有问题在向你请教