Cassandra 在启动时生成”java.lang.OutOfMemoryError: Java heap space”错误

Cassandra generates “java.lang.OutOfMemoryError: Java heap space” error on startup

我将系统从 13.04 升级到 13.10,但我无法再启动 Cassandra,出现内存不足错误,因此即使我当时所做的只是启动服务器,堆也已满。

我使用 -Xmx1992m(默认值)将最大堆大小增加到 -Xms2500m。

我想知道为什么需要做这样的事情?是不是在运行 Linux 内核 3.5.0 和迁移到内核 3.11.0 之间内存减少了一点,这会影响 Cassandra 吗? (即说我"丢失"了 200M,现在它分配了 1992Mb 而不是以前的内核的 2192Mb,可能是这样吗??)

我在这里担心的是,每当我升级时,我都可能遇到这样的问题,除非我将最大堆大小强制为固定数字(而不是让脚本确定要动态使用的 Mb。)另外,我就是不能继续永远增加限制。我的 RAM 有限...(显然。)

在启动 Cassandra 时显示以下内容(为了便于阅读,这里分为 3 行):

1
2
3
xss =  -ea -javaagent:bin/../lib/jamm-0.2.5.jar -XX:+UseThreadPriorities
       -XX:ThreadPriorityPolicy=42 -Xms1994M -Xmx2500M -Xmn400M
       -XX:+HeapDumpOnOutOfMemoryError -Xss256k

更新:

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

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

不知何故,它被设置回 OpenVMS 那里。虽然我更改了 /etc/alternatives/java 软链接,因此我的命令行中的 java -version 是"工作正常"(返回我所期望的),但 Cassandra 启动脚本使用了 $JAVA_HOME 变量!

所以我检查了可用虚拟机列表:

1
2
3
4
5
6
7
8
9
10
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 运行:

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

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


诸如应用程序、库甚至核心 Java 的内存使用情况如有更改,恕不另行通知。您应该期望记录特别大的更改,但在大多数情况下,这里只有几百 MB,否则不会。

这是一个普遍的真理,在大多数情况下,内存使用量会随着软件的开发而增加。随着程序变得更大,获得更多功能等,它们也会消耗更多内存。查看执行特定工作的特定软件需要多少内存的唯一方法是对其进行测试 - 如果软件版本发生变化,请再次测试。

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