gpt4 book ai didi

java - Grails 应用程序占用太多内存

转载 作者:搜寻专家 更新时间:2023-11-01 02:18:05 26 4
gpt4 key购买 nike

Tomcat 5.5.x 和 6.0.x

Grails 1.6.x

Java 1.6.x

操作系统 CentOS 5.x(64 位)

内存为384M的VPS服务器

JAVA_OPTS:尝试了很多组合——包括以下

导出 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进程的内存消耗从32M猛增到107M。但它没有崩溃,并且仍在可接受的范围内

所以继续寻找答案...我想知道我的 Linux 机器是不是出了什么问题。虽然不确定...

更新 2另见 http://www.grails.org/Grails+Test+On+Virtual+Server

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

最佳答案

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

(这似乎有点违反直觉,但请相信我:这种效果在理论上是可以预测的,在实践中是可以观察到的。)

编辑

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

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

  2. 运行应用一段时间,使其达到稳定状态,并找出其平均工作集是多少。您应该能够通过内存分析器或通过检查 GC 日志记录来弄清楚这一点。

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

实际上,您的问题还有另一个可能的原因。即使您告诉 Java 使用给定大小的堆,它也可能无法这样做。当 JVM 向操作系统请求内存时,有几种情况操作系统会拒绝。

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

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

最后,请注意 Java 使用更多的虚拟内存,这可以通过简单地将堆栈、堆和 permgen 数字相加来说明。有可执行文件 + DLL 使用的内存,用于 I/O 缓冲区的内存,可能还有其他东西。

关于java - Grails 应用程序占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2535458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com