提问者:小点点

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


我有一个服务器java应用程序使用码头websocket服务器和bittorrent-tracker websocket客户端

问题是当我与许多客户端运行时,它在我的java应用程序中有内存泄漏

我通过"htop"和"jcmdPIDVM检查java应用程序的内存使用情况。native_memory"

  • “htop”中的RES显示6.4G
  • “jcmd”中提交的内存显示2G

我使用的jetty websocket版本是jetty-9.4.15. v20190215,我尝试了较新版本的jetty-9.4.44.v20210927,但仍然存在内存泄漏

我已经测试了客户端构建从码头websocket客户端和内存泄漏不会发生

我还使用以下选项进行测试

  • 仅在我的服务器上使用lib jetty websocketjava应用程序
  • 当处理onMessage时,我只接收消息而不接受任何处理或响应

=

问题是

  • 哪里导致内存泄漏?
  • 为什么“htop”中的物理内存(RES)大于jcmd的已提交内存?

共1个答案

匿名用户

"哪里导致内存泄漏?"

这可能是您的代码。例如,如果websocket在服务器端没有正确关闭,它们可能会占用各种资源……包括堆外缓冲区等。

Jetty代码中存在导致这种情况的bug并非不可想象,但如果存在,人们会期望其他人会报告它,等等。(您是否检查过Jetty问题跟踪器,以确认Jetty websocket代码中内存泄漏的报告?)

无论哪种方式,您都需要进行一些调查。

为什么htop中的物理内存(RES)大于JVM中的内存使用量?

这并不罕见。典型的JVM除了Java堆之外还使用大量内存。这种用法包括:

  • JVM可执行文件使用的内存,以及它使用的本机库。
  • Metaspace…其中包含编译Java代码,等等。
  • 本机代码出于各种目的请求的堆外分配。
  • 内存映射文件等。