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
它证实了我的信念,即我的简单空白应用程序应该适用于我的配置.
尝试在尽可能少的内存中运行长期运行的基于Java的应用程序是错误的经济.垃圾收集器,因此如果它有足够的常规堆内存,应用程序将运行得更高效.给一个应用程序太少的堆,它将花费太多时间垃圾收集.
(这可能看起来有点违反直觉,但请相信我:这种影响在理论上是可预测的,在实践中是可观察到的.)
编辑
实际上,我建议采用以下方法:
首先运行Tomcat + Grails,尽可能多地提供内存,以便运行一些东西.(将permgen大小设置为默认值...除非您有明确证据表明Tomcat + Grails正在耗尽permgen.)
运行应用程序以使其达到稳定状态并找出其平均工作集是什么.您应该能够从内存分析器或通过检查GC日志记录来解决这个问题.
然后将Java堆大小设置为(比方说)测量的工作集大小的两倍或更多.(这是我试图在上面提出的观点.)
实际上,还有另一个可能导致问题的原因.即使您告诉Java使用给定大小的堆,也可能是它无法执行此操作.当JVM从OS请求内存时,操作系统会拒绝一些情况.
如果您所使用的操作系统没有任何更多的未分配"真正的"内存的机器(真实的或虚拟的),以及操作系统的交换空间已完全分配,就必须拒绝更多的内存请求.
每个进程的内存限制也有可能(尽管不太可能).这将导致操作系统拒绝超出该限制的请求.
最后,请注意Java使用更多虚拟内存,只需将堆栈,堆和permgen数字一起添加即可解释.可执行文件+ DLL使用的内存,用于I/O缓冲区的内存,以及可能的其他内容.