虚拟服务器上的Tomcat:JVM无法启动,因为44 GB RAM是不够的?

我正在租用运行Ubuntu 9.04的虚拟机。 我安装了SUN JDK 6.0(通过apt-get)和Tomcat 6.0.18(通过解压缩)。

Java的一般问题(部分解决)

起初,由于内存问题,无法运行JVM。 即使是一些简单的java -version失败

 Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. 

我想,即使free报告了44 GB的可用内存,我只能使用它的一小部分,如每个分配284 MB。 运行java -Xms10m -Xmx256m -version可以正常工作,但我不想更改每个调用java的脚本。

另外我读了关于JAVA_OPTS环境variables,这是很多应用程序的荣幸。 我把这个设置为"-Xms10m -Xmx256m"

问题与Tomcat

tomcat启动脚本catalina.sh也使用JAVA_OPTS 。 但事件,但我还是得到了上面提到的三个错误行,在logs/catalina.out可读。 我知道使用了JAVA_OPTS,因为当我把废话放入这个variables时,我看到了logs/catalina.out

看起来Tomcat也想启动javac,它需要前缀为-J的选项-J-Xms10m -J-Xmx256m 。 但是我不确定这是否与问题有关,因为没有比这三条线更多的输出。

我通过bin/startup.sh启动Tomcat,然后调用bin/catalina.sh 。 我知道也有通过jsrv启动它的可能性,但我不能这样做,因为jsrv的make / configure过程也想调用javac ,因为上面提到的众所周知的三行错误信息失败了。

现在我对两种可能的解决scheme感兴趣:

  • 我怎么能让Java在我的虚拟主机上工作 ,无论是谁调用javajavac而不pipe他怎么调用呢?
  • 如果这是不可能的,我怎样才能调整Tomcat运行?

PS:请注意,我只能控制虚拟机,但没有控制权,只能掌握周围物理机器的知识。

PPS: 对于这个问题的不好意思,我很抱歉,但是我觉得原来的,写得不错的标题没有吸引足够的读者,所以我认为这可能会有所帮助;)这实际上是有帮助的,因为我在第一个小时得到了0个观点,在改变后的小时内有8次观看。 陌生的世界。

编辑:这是ulimit -a的输出:

 core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

javac一般会产生一个独立的进程,它应该落在不同的进程规则之下。

-J选项是通过包装器/启动器传递参数到JVM,我没有看到这在Tomcat上。

找出-Xmx来自哪里:

find /your/install/dir/with/tomcat |xargs grep '-Xmx'

尝试在启动tomcat之前运行ulimit -v unlimited 。 如果这样做,你可以把它添加到一个或两个启动脚本,或者在/etc/profile~/.bashrc或者其他一些shell脚本中。

在缺less替代品的时候,我尝试了一个肮脏的黑客行为:用shell脚本replacejavajavac ,确保传递正确的参数,并让我看到确切的参数列表。 既然这已经是一个非常具体的解决scheme,而不是问题的一部分,我想把它作为一个答案。

我在我的文件系统中search了所有的java出现。 有很多方法,因为我的机器上有几个JRE和JDK。 即使删除了所有版本,但仍然有很多。 我用find / -name "java" |xargs file找出哪一个是真正的 。 它告诉我:

 /var/lib/dpkg/alternatives/java: ASCII text /etc/alternatives/java: symbolic link to `/usr/lib/jvm/java-6-sun/jre/bin/java' /usr/share/java: directory /usr/lib/jvm/java-6-sun-1.6.0.16/bin/java: symbolic link to `../jre/bin/java' /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.4.0, not stripped /usr/bin/java: symbolic link to `/etc/alternatives/java' 

所以我知道/usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java是可执行文件。 我将它重命名为javaexec并在它的旧位置放置了一个shell脚本:

 mv /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/javaexec nano /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java (see below for file contents) chmod +x #!/bin/bash -e 

这确保了在最后对java每个调用都指向了我的脚本,这将会使用正确的参数调用可执行文件。 之后,我做了类似的可怕的事情javac 。 我的脚本的内容:

 #!/bin/bash -e line="" for i in $* do if [[ "$i" == *Xmx* ]]; then echo "Seen -Xmx and removed" elif [[ "$i" == *MaxPerm* ]]; then echo "Seen -XX:MaxPermSize and removed" else line="$line $i" fi done exec="/usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/javaexec -Xms10m -Xmx100m $line" echo Now executing $exec $exec 

它从涉及-Xmx或类似-XX:MaxPermSize的命令行中删除每个参数,并放入其自己的-Xms和-Xmx限制。

当我现在启动Tomcat时,它仍然失败,但最后,JVM启动,执行某些操作,然后退出并显示一条有意义的消息。 没有卷轴的成功,但它让我更加满意,因为从那里开始,我知道该怎么做。 虽然Tomcat仍然不能运行,但它有一个很好的副作用:

现在我终于可以通过命令行或脚本调用javajavac了,它们不会崩溃,以前根本不可能! 他们只是 嘿,我感觉就像是这个词的王,我终于拿到java在一台44GB RAM的机器上运行,而没有抱怨内存不足。 这是计算史上的一个伟大的一天!

你也可以检查你已经安装的Java虚拟机。 确保,这不是给你问题的gcj环境。

尝试

 update-java-alternatives -l 

查看sun-java6是否是您的默认设置。 放下“-l”来查看这个命令的其他选项 – 比如如何改变默认值。

如果我没有记错的话,我在ubuntu上的所有java问题的根目录都是默认的(它可能是sun-java6之前的依赖项)。 如果我没有记错的话,那至less是大部分的问题。

最后但并非最不重要的(只涉及到你的问题):你可以把名为“setenv.sh”的文件放到tomcat的bin目录下。 这个文件不存在,但会在启动时读取,如果可以find。 您可以在这里进行所有更改,以便稍后参考。 唯一的小缺点是,它们将在启动时以及closures时被读取。

一旦我有类似的问题。 你可以尝试启动Java

vm.overcommit_memory = 1

在/etc/sysctl.conf中设置。 或者直接回显"1" > /proc/sys/vm/overcommit_memory

或者玩overcommit_memory,overcommit_ratio http://www.redhat.com/magazine/001nov04/features/vm/