根据官方文档,建议G1将Cassandra最大堆大小设置得尽可能大,最高可达64G。我们这样做有什么原因吗?更大的堆大小是否意味着更好的 gc 性能等,更短的暂停/更少的 gc 频率? https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/operations/opsTuneJVM.html
这完全取决于应用程序。如果你有更多的堆,你可能会看到更少的 gc 暂停,但随之而来的是更长的 gc 暂停的可能性。此外,如果分配存活到 Old Gen,您的 gc 暂停可能会很长。
最典型的是,我看到堆有 31GiB。如果您开始看到由于巨大的对象分配等原因而导致长时间的GC暂停,您可以增加堆和区域大小。理想情况下,您可以将对象(单个单元格)保持在 4MiB 以下,这样就可以使用 31GiB 内存。
另外,我明确将其设置为 31GiB,而不是 32GiB,因为在某些情况下,内存将设置为超过 OOP 压缩所允许的值。您想保持压缩状态。
您可以使用它来检查您的 Java 版本在哪一点对象指针压缩结束:
java -Xmx32767M -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-8u242-b08-0ubuntu3~16.04-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
Optimized Ordinary Pointers enabled: