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

Posted

技术标签:

【中文标题】Cassandra 在启动时生成“java.lang.OutOfMemoryError: Java heap space”错误【英文标题】:Cassandra generates “java.lang.OutOfMemoryError: Java heap space” error on startup 【发布时间】:2014-02-24 23:18:56 【问题描述】:

我将系统从 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,因为指向 /usr/lib/jvm/default-java 的 $JAVA_HOME 变量(它在 /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

但是,这并没有改变我仍然需要在内存方面有较大上限的事实。

【问题讨论】:

32 位还是 64 位 jvm? 哦!我想把信息和参数等放在一起。我在64位。使用 Oracle,虽然它是在我重新启动时在 OpenJVM 上设置的,直到我测试后才注意到,所以它在 OpenJVM 上尝试了几次。都是第 7 版。 哦!我将替代方案更改为 Oracle,但看起来这还不够。它利用了/usr/lib/jvm/default-java/bin/java,看起来就是OpenJVM。啊! 那么一个简单的Java测试程序报告有多少内存可用? @ThorbjørnRavnAndersen,不知道。我不写Java代码。 -Xms 和 -Xmx 定义了软件的可用堆。我发现理解 Cassandra 真的很困难,部分原因是我自己不使用 Java,因此很多事情在这方面真的不清楚。 【参考方案1】:

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

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

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

【讨论】:

是的......不幸的是,有时这也意味着事情停止工作,这是一个真正的烦恼。例如,此时我根本没有声音。自从我 4 或 5 年前拿到电脑后,它就可以正常工作。真可惜。

以上是关于Cassandra 在启动时生成“java.lang.OutOfMemoryError: Java heap space”错误的主要内容,如果未能解决你的问题,请参考以下文章

本地安装Cassandra

9160 启动cassandra后端口未打开

无法使用 bin/cassandra 启动 Cassandra db

cassandra.bat -f - 在Windows 8.1专业版中启动cassandra的问题

如何在从 Spark 消费 Kafka 时获取偏移 id,将其保存在 Cassandra 中并使用它来重新启动 Kafka?

启动cassandra时“Local host name unknown...UnknownHostException”错误解决