java.lang.OutOfMemoryError:直接缓冲区内存并且由于

时间:2018-01-03 11:35:44

标签: java cassandra

我的一个cassandra节点正在aws实例上运行,有时它被停止了,我在system.logcassandra.log文件中看到了以下信息。 可能是造成这类错误的原因

java.lang.OutOfMemoryError: Direct buffer memory

Not marking nodes down due to local pause of

如何解决这些问题

1 个答案:

答案 0 :(得分:2)

解决方案是在所有节点上安装Java 8并将GC策略更改为G1,结果令人惊讶。 我已经使用G1垃圾收集算法启动了8GB堆的所有节点,我看到了立即改进,使用的堆每个节点没有超过4GB,并且GC时间减少了。

我将解释我为改变设置与G1GC一起运行所采取的步骤,我将详细说明一切是如何工作的。

(在我写完这篇文章之后,我发现这篇文章太长了,所以我决定很好,为丰富的部分留下很多东西,所以请随意跳过它们)

安装最新的Oracle JDK 8以获得G1GC的最新更新。这也适用于Java JRE / JDK,而不是Java 7更新4,但是建议使用Apache Cassandra Java 8。

安装Java 8(适用于基于Debian的系统): 添加Oracle存储库,更新本地apt-get缓存并安装oracle-java8-installer软件包:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

自动安装(自动接受许可)

echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections

sudo apt-get install oracle-java8-set-default

在环境中设置“JAVA_HOME”变量:

sudo vim /etc/environment

在文件末尾添加这些行。

 JAVA_HOME="/usr/lib/jvm/java-8-oracle/"
 PATH=$PATH:$JAVA_HOME/bin

重新加载新添加的环境变量:

source /etc/environment

我们现在安装了Java 8 JDK。

要设置G1算法以在特定节点上运行,您需要按照以下步骤操作:

  1. cassandra-env.sh文件中添加以下行:

    G1 - 参数

    JVM_OPTS="$JVM_OPTS -XX:+UseG1GC" JVM_OPTS="$JVM_OPTS -XX:G1RSetUpdatingPauseTimePercent=5" JVM_OPTS="$JVM_OPTS -XX:+PrintFlagsFinal"

  2. 您需要注释掉默认情况下可能存在的所有CMS特定标志。搜索这些并小心别人:

    -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSWaitDuration=10000 -XX:+CMSClassUnloadingEnabled

  3. 就是这样,

    只需重新启动节点即可启动并运行!

    参考: - http://progexc.blogspot.in/2015/12/taking-care-of-garbage-in-cassandra.html