Grails应用程序占用了太多内存

时间:2010-03-29 02:19:25

标签: java web-applications tomcat grails

Tomcat 5.5.x和6.0.x

Grails 1.6.x

Java 1.6.x

OS CentOS 5.x(64位)

内存为384M的VPS服务器

JAVA_OPTS:尝试了许多组合 - 包括以下

export JAVA_OPTS =' - Xms128M -Xmx512M -XX:MaxPermSize = 1024m'

export JAVA_OPTS =' - server -Xms128M -Xmx128M -XX:MaxPermSize = 256M'

(正如http://www.grails.org/Deployment所述)

我创建了一个空白的Grails应用程序,即只需给出命令grails create-app然后将其命名为

我在VPS服务器上运行Tomcat

当我只是启动Tomcat服务器时,没有部署应用程序,可用内存大约为236M 并且使用的内存大约是156M

当我部署“空白”应用程序时,内存消耗达到360M,最后一旦占用所有可用内存,Tomcat实例就会被终止

如您所见,我的应用尽可能轻松。

不确定为什么内存消耗量一样高。

我实际上正在对一个真实的应用程序进行故障排除,但已经缩小到这个更容易分享和解释的方案。

更新 我在Windows上的本地Tomcat 5.5.x上测试了相同的“空白”应用程序,它运行良好

Java进程的内存消耗从32 M到107M。但它没有崩溃,它仍然在可接受的限度内

所以继续寻找答案......我想知道我的Linux机箱是否有问题。不知道虽然......

更新2 另请参阅此http://www.grails.org/Grails+Test+On+Virtual+Server

这证实了我的信念,即我的简单空白应用程序应该适用于我的配置。

3 个答案:

答案 0 :(得分:6)

尝试在尽可能少的内存中运行长时间运行的基于Java的应用程序是错误的经济。垃圾收集器,因此如果它有足够的常规堆内存,应用程序将运行得更高效。给一个应用程序太少的堆,它将花费太多时间垃圾收集。

(这可能看起来有点违反直觉,但请相信我:这种影响在理论上是可预测的,在实践中是可观察的。)

编辑

实际上,我建议采用以下方法:

  1. 首先运行Tomcat + Grails,使用尽可能多的内存以便运行。 (将permgen大小设置为默认值...除非您有明确证据表明Tomcat + Grails正在耗尽permgen。)

  2. 运行应用程序以使其达到稳定状态并找出其平均工作集是什么。您应该能够从内存分析器中或通过检查GC日志记录来解决这个问题。

  3. 然后将Java堆大小设置为(例如)两次测量的工作集大小或更多。 (这是我试图在上面提出的观点。)

  4. 实际上,还有另一个可能导致问题的原因。即使您告诉Java使用给定大小的堆,但可能无法执行此操作。当JVM从操作系统请求内存时,操作系统会拒绝这种情况。

    • 如果您运行操作系统的机器(实际或虚拟)没有任何更多未分配的“实际”内存,并且操作系统的交换空间已完全分配,则必须拒绝更多内存请求。

    • 每个进程的内存限制也有可能(尽管不太可能)。这将导致操作系统拒绝超出该限制的请求。

    最后,请注意Java使用更多的虚拟内存,只需将堆栈,堆和permgen数字一起添加就可以解决这个问题。可执行文件+ DLL使用的内存,用于I / O缓冲区的内存,以及可能的其他内容。

答案 1 :(得分:0)

384MB非常小。我在enjoyvps.net上运行了一个512MB VPS的小型Grails应用程序(不以任何方式附属,只是一个快乐的客户),它已经运行了几个月,不到200MB。我正在运行一个32位Linux和JDK,如果你无法访问大量内存,那么就没有任何意义在64位指针中浪费所有内存。

答案 2 :(得分:0)

您可以尝试部署tomcat监控Web应用程序,例如psiprobe并查看内存的使用位置?