我有一个服务器java应用程序,使用jetty websocket服务器和用于websocket客户端的bittorrent跟踪器
问题是,当我使用许多客户端运行时,我的java应用程序中存在内存泄漏
我通过";htop";以及";jcmd-PID-VM.native_memory";
- RES在";htop";显示6.4G
- 在";jcmd";显示2G
我使用的jetty websocket版本是jetty-9.4.15.v20190215,我尝试了更新的版本jetty-9.4.44.v20210927,但仍然存在内存泄漏
我测试了从jetty websocket客户端构建的客户端,不会发生内存泄漏
我还测试了以下选项
- 仅在我的服务器java应用程序上使用lib-jjetty websocket
- 当处理onMessage时,我只接收消息,不接受任何进程或响应
=>基本上,服务器只接收来自客户端的连接,内存泄漏仍然会发生。
问题是
- 内存泄漏的原因是什么
- 为什么物理存储器(RES(在";htop";大于jcmd提交的内存
"内存泄漏的原因是什么">
这可能是您的代码。例如,如果服务器端没有正确关闭websocket,它们可能会占用各种资源。。。包括堆外缓冲区等等
Jetty代码中有一个错误导致了这种情况,这并非不可想象,但如果有,人们会认为其他人会报告它,等等。(您是否检查过Jetty问题跟踪器,是否有已确认的Jetty websocket代码内存泄漏报告?(
不管怎样,你都需要做一些调查。
Why physical memory(RES(in";htop";是否大于JVM中的内存使用量?
这并不罕见。除了Java堆之外,典型的JVM还使用大量内存。此用法包括:
- JVM可执行文件使用的内存,以及它使用的本机库
- 元空间。。。其保存已编译的Java代码等等
- 本机代码为各种目的请求的堆外分配
- 内存映射文件等等