Cassandra在启动时出现“java.lang.OutOfMemoryError: Java heap space”错误。

4
我将我的系统从13.04升级到13.10后,我无法启动Cassandra了,出现了内存溢出错误,即使此时我所做的一切只是启动服务器,堆栈也已经满了。 我使用 -Xmx1992m(默认值)将最大堆大小增加到 -Xms2500m。我想知道为什么需要这样做?可能是在运行Linux内核3.5.0和移动到内核3.11.0之间,内存稍微减少了一点,会对Cassandra产生影响吗?比如说,我“丢失”了200M,现在与以前的内核相比,它分配的是1992Mb而不是2192Mb,这可能吗?我的担忧是,每次升级都可能遇到这样的问题,除非我强制将最大堆大小设置为固定数字(而不是让脚本动态确定要使用的Mb)。另外,我不能一直增加限制。我的RAM是有限的...(显然)。

在启动Cassandra时,显示以下内容(在此处断开3行以便更容易阅读):
xss =  -ea -javaagent:bin/../lib/jamm-0.2.5.jar -XX:+UseThreadPriorities
       -XX:ThreadPriorityPolicy=42 -Xms1994M -Xmx2500M -Xmn400M
       -XX:+HeapDumpOnOutOfMemoryError -Xss256k

更新:

糟糕!它仍然在启动OpenVMS,因为$JAVA_HOME变量指向了/usr/lib/jvm/default-java(它在/etc/environment中定义):

JAVA_HOME=/usr/lib/jvm/default-java

不知何故,它又被设置回OpenVMS了。尽管我已更改了/etc/alternatives/java softlink,因此在命令行中的java -version运作正常(返回我期望的结果),但Cassandra启动脚本使用了$JAVA_HOME变量!

因此,我通过以下命令检查可用的虚拟机列表:

ls -l /usr/lib/jvm

lrwxrwxrwx 1 root root   24 Apr 27  2012 default-java -> java-1.7.0-openjdk-amd64
drwxr-xr-x 4 root root 4096 Feb 23 17:54 java-1.5.0-gcj-4.8-amd64
lrwxrwxrwx 1 root root   20 Sep  2  2012 java-1.6.0-openjdk-amd64 -> java-6-openjdk-amd64
lrwxrwxrwx 1 root root   20 Jul  3  2013 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64
drwxr-xr-x 5 root root 4096 Oct  7  2012 java-6-openjdk-amd64
drwxr-xr-x 3 root root 4096 Oct  7  2012 java-6-openjdk-common
drwxr-xr-x 5 root root 4096 Sep 21 20:06 java-7-openjdk-amd64
drwxr-xr-x 8 root root 4096 Sep 18 21:18 java-7-oracle

然后运行以下两个命令以使Oracle运行:

sudo rm /usr/lib/jvm/default-java
sudo ln -s java-7-oracle /usr/lib/jvm/default-java

然而,这并没有改变事实,即我仍需要有一个大的内存上限。


32位还是64位的JVM? - Thorbjørn Ravn Andersen
哦!我想用参数和其他信息来放置这些信息。我使用的是64位系统。使用Oracle,尽管在重新启动后设置为OpenJVM,但我没有注意到,直到测试之后才发现,所以它尝试了几次OpenJVM。两个版本都是7。 - Alexis Wilke
哦!我把备选项改成了Oracle,但似乎这还不够。它使用的是/usr/lib/jvm/default-java/bin/java,看起来应该是OpenJVM。啊! - Alexis Wilke
一个简单的Java测试程序报告可用多少内存? - Thorbjørn Ravn Andersen
你设置默认的Java版本的方式不正确。我建议你去http://askubuntu.com查看如何操作。同时,请确保你正在运行64位JVM。Openjdk对你的需求应该是足够好的。 - Thorbjørn Ravn Andersen
显示剩余2条评论
1个回答

2

应用程序、库甚至核心Java的内存使用情况可能会不经通知而发生变化。你应该预计特别大的更改将被记录下来,但在大多数情况下,几百MB的变化不算什么。

一般来说,随着软件的开发,内存使用量会增加。随着程序变得更大,具备更多功能等,它们也会消耗更多的内存。了解一个特定软件在执行特定任务时需要多少内存的唯一方法是测试它,并在软件版本变化时再次测试。

最简单的方法就是确保首先分配足够的空间,这样即使出现小的增加也不会成为问题。


是的...不幸的是,有时它也意味着事情停止工作,这真的很烦人。例如,此时我根本没有声音。自从我买了这台电脑4或5年以来,它一直都能用。真是遗憾。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接