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,因为指向 /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

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

4

1 回答 1

2

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

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

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

于 2014-02-24T23:32:55.210 回答