【发布时间】:2019-08-27 04:18:54
【问题描述】:
详细信息: 节点有 31G 内存。 DSE: 5.1.3 => Cassandra 3.11.2
java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
尝试的配置更改如下。
尝试更改 cassandra-env.sh
MAX_HEAP_SIZE="16g"
HEAP_NEWSIZE="16g"
另外,将 cassandra-env.sh 中的 $CASSANDRA_CONF 更新到 /etc/dse/cassandra 并尝试了。
而且还厌倦了通过在 cassandra-env.sh 文件中注释掉来更改 jvm.options
-Xms16G
-Xmx16G
进行上述任何更改,为什么堆大小没有更改为 16GB。
1)
java -XX:+PrintFlagsFinal -version | grep -iE 'MaxHeapSize'
uintx MaxHeapSize := 8392802304 {product}
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
2)
java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=524467520 -XX:MaxHeapSize=8391480320 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
为什么虽然设置为 16GB,但它只显示大约 8GB,为什么 maxheapsize 与 JVM 标志输出存在差异。
【问题讨论】:
-
当您运行
java -XX:+PrintFlagsFinal时,您只是启动了一个与Cassandra 完全没有联系的新 Java 进程。如果要检查现有 Java 进程,请改用jcmd。例如。jcmd PID VM.flags或jcmd PID GC.heap_info -
谢谢,但是为什么 MaxHeapSize 与 +PrintCommandLineFlags 和 +PrintFlagsFinal 有区别
-
PrintFlagsFinal在应用 JVM 人体工程学、调整、对齐等之后打印 final 值。在这种情况下,8392802304 是将 8391480320 舍入到 2 MB 边界的结果(请记住关于我在previous answer) 中提到的堆对齐? -
是的,这就是混乱的地方。我认为应该是 2MB 或 0 的差异。所以 1321984(1.2MB) 的差异是四舍五入的差异(为什么要四舍五入?)。那么,在哪些情况下我们需要使用这些标志“+PrintCommandLineFlags & +PrintFlagsFinal”,如果它们提供新的 java 进程输出(是否只是为了知道可用的默认值)。
-
我从未使用过
PrintCommandLineFlags。但PrintFlagsFinal实际上对于查看 JVM 选项及其默认值或覆盖值的整个列表很有用。