Tomcat 5.5.x和6.0.x
Grails 1.6.x
Java 1.6.x
OS CentOS 5.x(64位)
VPS服务器,内存为384M
JAVA_OPTS:尝试了许多组合-包括以下内容
出口JAVA_OPTS =’-Xms128M -Xmx512M -XX:MaxPermSize = 1024m’
导出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向操作系统请求内存时,在某些情况下操作系统会拒绝。
如果运行操作系统的计算机(真实或虚拟)不再具有未分配的“真实”内存,并且已完全分配了操作系统的交换空间,则它将不得不拒绝更多内存的请求。
每个进程的内存限制也可能(尽管不太可能)生效。这将导致操作系统拒绝超出该限制的请求。
最后,请注意,Java使用了更多的虚拟内存,只需将堆栈,堆和permgen编号加在一起即可解决。有可执行文件+ DLL使用的内存,用于I /
O缓冲区的内存,可能还有其他内容。
我目前正在Jetty中运行一个Grails应用程序。它运行良好,但占用的内存比我想要的多。 显示Jetty正在运行,如下所示: 在我看来,Jetty可能使用的最大内存应该是。相反,它看起来是这样的: 显然,我不会期望内存使用量正好是320 MB,但难道不应该接近吗?为什么会是预期内存的两倍?如果有的话,那么当堆填满时,Java难道不应该拒绝分配更多的空间吗? 我试着详细了解是怎么回事,但在我看来,
嗨,我对java编程还比较陌生。我编写的下面的程序似乎占用了很多内存(大约240 MB,正常吗?-我不这么认为!)请建议一些方法来优化这个程序,以便减少内存存储。 程序-- 代码-
为什么我的java PID占用更多内存。目前我有24GB ram和max-xmx=15G。所以java PID的解决方案是占用更少的内存。 23794 root 0 22.2g 16.5g 13416 s 100.070.42980:54上面的java是我的最高命令结果。任何人都知道如何重新关注这个问题。
问题内容: 我目前正在HashSet中存储单词列表(大约120,000个),目的是用作列表来检查所迷惑的单词以查看其拼写是否正确,并仅返回yes或no。 我想知道是否有一种方法可以占用更少的内存。当前120,000个单词约为12兆字节,从中读取单词的实际文件约为900 kb。 有什么建议? 提前致谢 问题答案: 查看布隆过滤器或布谷鸟哈希。布隆过滤器或cuckoo-hashing?http://c
问题内容: 我使用node_redis库在node中编写了一个小的redis发布者。程序完成发布1M消息后,它将继续容纳约 350 MB 的内存。谁能提供任何线索说明该程序为何需要这么多的内存以及如何释放内存? 以下是代码段- 问题答案: 这里有两个问题。 为什么程序需要这么多的内存? 我认为这是由于缺乏反压力。 您的脚本仅向Redis发送1M发布命令,但不处理对这些命令的任何答复(因此,它们仅由
问题内容: 有没有办法找出我的Java线程在虚拟机中占用多少内存? 例如,使用堆栈跟踪转储或其他某种方式。 问题答案: Java线程将堆用作共享内存。各个线程都有其堆栈(您可以通过-Xss命令行选项设置其大小,默认为512KB),但是所有其他内存(堆)都不属于特定线程,并询问一个特定线程仅使用了多少内存没有道理。