Cassandra在启动时生成“java.lang.OutOfMemoryError:Java堆空间”错误

时间:2014-02-24 23:18:56

标签: java cassandra out-of-memory cassandra-2.0

我将系统从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软链接,因此命令行中的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

然而,确实改变了我仍然需要在内存方面有一个很大的上限的事实。

1 个答案:

答案 0 :(得分:2)

应用程序,库甚至核心Java的内存使用情况如有变更,恕不另行通知。您应该期望记录特别大的变化,但在大多数情况下,这里或那里将有几百MB。

一般的说法是,在大多数情况下,随着软件的发展,内存使用量会增加。随着程序变得越来越大,获得更多功能等,它们也会消耗更多内存。查看执行特定工作的特定软件需要多少内存的唯一方法是测试它 - 以及软件版本是否会再次测试它。

最简单的方法就是确保首先分配足够的净空,小幅增加不会成为问题。