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

RN.*_*RN. 4 java grails tomcat web-applications

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然后对它进行WARed

我在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

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

Ste*_*n C 6

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

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

编辑

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

  1. 首先运行Tomcat + Grails,尽可能多地提供内存,以便运行一些东西.(将permgen大小设置为默认值...除非您有明确证据表明Tomcat + Grails正在耗尽permgen.)

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

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

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

  • 如果您所使用的操作系统没有任何更多的未分配"真正的"内存的机器(真实的或虚拟的),以及操作系统的交换空间已完全分配,就必须拒绝更多的内存请求.

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

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