Java进程的物理内存大于jcmd提交的内存



我有一个服务器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代码等等
  • 本机代码为各种目的请求的堆外分配
  • 内存映射文件等等

相关内容

  • 没有找到相关文章

最新更新