java - 为什么在我的 Tomcat JRuby 应用程序中从未释放内存?

标签 java ruby-on-rails tomcat jruby jrubyonrails

我有一个在 Tomcat (Warble) 中运行的 JRuby on Rails 应用程序。它使用 Java 桥连接到 Progress(OpenEdge) 应用程序服务器...当我监视内存时,它只会不断上升。

  • Tomcat 7.0
  • JRuby 1.6.7.2 (Ruby-1.9.2-p312)
  • JVM 1.7.0.25
  • rails 3.2.7
  • jruby-rack 1.1.7
  • 莺 1.3.6

找出问题根源的最佳方法是什么?我猜它可能是未清理的 JRuby 对象,或者是 Java 桥或垃圾收集器中的某些东西没有完成它的工作...

即使我让进程运行半小时,内存也不会下降...

  • 有没有办法知道哪些对象是活的?
  • 是否有易于使用的免费工具,我可以通过这些工具获得有关谁在使用所有内存的更多信息?

顺便说一下,我已经配置了 Tomcat 服务器使用更多内存,但这只是延迟堆空间错误...

编辑:我实际看到的是 Tomcat 只使用了它可以最大程度使用的所有内存(最大内存池)。它永远不会释放它。也许这只是正常行为...例如,我现在将最大值设置为 256MB,在任务管理器中,内存仅保持在 256MB 左右。

编辑:

当创建堆转储并让 Eclipse 使用 Eclipse 内存分析器对其进行分析时,这就是我得到的报告。我认为这是正常的,因为该工具可能不期望整个 JRuby 故事......

问题嫌疑人1

“org.jruby.RubyClass”的 6.458 个实例,由“org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988”加载,占用 56.969.616 (31,78%) 字节。

关键字 org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988 org.jruby.RubyClass

问题嫌疑人2

“org.jruby.internal.runtime.methods.DefaultMethod”的 10.597 个实例,由“org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988”加载,占用 22.182.112 (12,37%) 字节。

关键词 org.jruby.internal.runtime.methods.DefaultMethod org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988

问题嫌疑人3

“org.jruby.RubyModule”的 3.144 个实例,由“org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988”加载,占用 21.226.816 (11,84%) 字节。

关键词 org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988 org.jruby.RubyModule

问题嫌疑人4

8.888 个“org.jruby.MetaClass”实例,由“org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988”加载,占用 18.563.784 (10,35%) 字节。

关键词 org.jruby.元类 org.apache.catalina.loader.WebappClassLoader @ 0x700ec6988

最佳答案

首先:256M 堆空间对于 Java 应用程序来说并不多 - 特别是当涉及到一个完整的 servlet 容器/应用程序服务器并且(可能)有很多库时。

Java 通常不会将内存交还给操作系统——一旦分配了内存,内存就被视为由 JVM 拥有。我相信可能有一些内存管理的实现会交还内存,但我从未见过它们。我在生产环境中的典型建议是让 -Xmx 等于 -Xms 无论如何(分配您希望 JVM 能够立即分配的所有内存)

堆空间用尽是两种(或更多)情况之一的信号:a) 您的应用程序存在内存泄漏,b) 您没有为应用程序需求分配足够的空间。

为您的 JVM 增加内存分配并监控内存使用和垃圾收集以排除 b) - 如果您可以安全地说您的应用程序有足够的内存满足其需求,则寻找 a) 并找到内存的根本原因泄漏。您最好为此使用性能分析器,但是对于 256M 的内存,您很可能只是没有足够的内存。

关于java - 为什么在我的 Tomcat JRuby 应用程序中从未释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17314148/

相关文章:

java - Spring 如何映射 URL 以及在哪里阅读更多相关信息

Tomcat SSL : No trusted certificate found

ruby-on-rails - zurb-foundation javascripts 不起作用

Java:未捕获的异常错误?

java - AlertDialog.Builder 不将 ArrayList<String> 显示为列表

java - 什么是NullPointerException,我该如何解决?

ruby-on-rails - require_tree参数必须是Rails 5升级的应用程序中的目录

ruby-on-rails - 在 Windows 上安装 libxml-ruby 时遇到问题

java - java/jsp Web 应用程序中的 FileOutputStream 路径

java - 把我所有的 bean 放在不同的文件中