找到java虚拟内存资源

时间:2013-09-03 15:36:57

标签: java servlets memory jvm

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

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

重新启动servlet暂时修复了问题,但问题是如何在代码中找到并修复导致此类内存占用的位置?

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

编辑: 已经研究了以下内容:我启动了Eclipse Memory Analyzer和jConsole,以便在一些ruby脚本发送请求时查看应用程序。 (每分钟40到70个请求。这不仅仅是servlet目前正在投入生产。)

使用此设置:

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

  

如何在代码中找到并修复导致此类内存占用的位置

searching this site开始。有数千个结果。 对于您的具体情况,我会寻找以下内容:

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