0

我目前面临一个非常奇怪的问题。我编写了一个简单的 servlet,它在自托管码头容器中运行。此 servlet 是 JS 脚本的日志记录端点。所以脚本只运行非常简单的代码来记录到 graylog 和一些文件(由 log4j 文件附加程序管理。)

管理员向我抱怨说 servlet 占用了高达 10.5GB 的虚拟内存,导致整台机器速度变慢。这对其他一些监控服务的性能产生了影响。

重新启动 servlet 暂时解决了问题,但问题是如何找到并修复代码中导致这种内存占用的问题?

编辑:我用-Xmx50m开关启动应用程序。

编辑:已经调查了以下事情:我启动了 Eclipse Memory Analyzer 和 jConsole 来查看应用程序,同时一些 ruby​​ 脚本发送了请求。(每分钟 40 到 70 个请求。这比 servlet 目前投入生产的要多。)

使用此设置:

  • 堆大小:4MB
  • 平均运行线程数:19(峰值为 23)
  • 虚拟内存:5GB

重新启动 servlet 加速了服务器。servlet 唯一可疑的参数是 10.5GB 虚拟内存。

4

2 回答 2

0

如何在代码中找到并修复导致这种内存占用的问题

从搜索此站点开始。有数以千计的结果。对于您的具体情况,我会寻找以下内容:

  • 一个不合理的大堆规范,-Xmx在启动 Java 时使用命令行参数。对于一个简单的 servlet,您应该使用 100-200 Mb。
  • 线程数过多。每个线程的内部堆栈都需要空间(默认为 2 Mb)。
  • 大型内存映射文件。你描述你的servlet的方式,你不应该使用这些。
于 2013-09-03T16:28:37.573 回答
0

虚拟内存不使用太多资源,只有常驻内存很重要。您可以创建一个使用 8 TB 虚拟内存的进程,它对资源的影响仍然很小。

在 Linux 上,检查虚拟内存的“最简单”方法是读取,/proc/{pid}/mmap即使这非常神秘。

我会检查常驻内存,这才是真正重要的,但我怀疑如果他们抱怨它接近你的 10.5 GB(假设他们知道他们在说什么,我不会假设)

于 2013-09-03T15:43:38.140 回答