Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

JVM Tuning for Cassandra

Optimize JVM settings for optimal Cassandra performance.

System RAMHeap SizeNotes
8GB4GBDevelopment only
32GB8GBSmall production
64GB16GBStandard production
128GB+31GBMaximum recommended

Key Rules:

  • Never exceed 31GB (compressed oops limit)
  • Leave 50%+ RAM for OS page cache
  • Set -Xms equal to -Xmx
Terminal window
# jvm11-server.options or jvm17-server.options
# Heap size (adjust for your system)
-Xms16G
-Xmx16G
Terminal window
# G1GC Configuration
-XX:+UseG1GC
-XX:MaxGCPauseMillis=500
-XX:G1RSetUpdatingPauseTimePercent=5
-XX:InitiatingHeapOccupancyPercent=70
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4
-XX:+ParallelRefProcEnabled
-XX:MaxTenuringThreshold=1
-XX:G1HeapWastePercent=10
Terminal window
# ZGC for ultra-low latency
-XX:+UseZGC
# ZGenerational is available in JDK 21+ only
# -XX:+ZGenerational
-XX:SoftMaxHeapSize=28G
-XX:ZCollectionInterval=0

ZGC Version Requirements

  • JDK 11-16: ZGC is experimental (-XX:+UnlockExperimentalVMOptions required)
  • JDK 17-20: ZGC is production-ready (non-generational)
  • JDK 21+: ZGenerational mode available via -XX:+ZGenerational
Terminal window
# Shenandoah GC
-XX:+UseShenandoahGC
-XX:ShenandoahGCHeuristics=compact
Terminal window
# Comprehensive GC logging
-Xlog:gc*:file=/var/log/cassandra/gc.log:time,uptime,level,tags:filecount=10,filesize=10M
-Xlog:safepoint:file=/var/log/cassandra/safepoint.log:time,uptime:filecount=5,filesize=5M
Terminal window
-XX:MetaspaceSize=128M
-XX:MaxMetaspaceSize=256M
Terminal window
# For memtable_offheap and file cache
-XX:MaxDirectMemorySize=4G
Terminal window
# Reduce stack size for many threads
-Xss256k
Terminal window
# String deduplication (G1GC only)
-XX:+UseStringDeduplication
-XX:StringDeduplicationAgeThreshold=1
Terminal window
# Tiered compilation (default)
-XX:+TieredCompilation
# Code cache
-XX:ReservedCodeCacheSize=256M
-XX:+UseCodeCacheFlushing
Terminal window
# Prevent application-triggered GC
-XX:+DisableExplicitGC
Terminal window
# Automatic heap dump on OOM
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/lib/cassandra/
# Exit on OOM (let orchestrator restart)
-XX:+ExitOnOutOfMemoryError
Terminal window
-Djava.rmi.server.hostname=<node_ip>
-Dcom.sun.management.jmxremote.port=7199
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
/etc/cassandra/jvm11-server.options
#####################
# HEAP CONFIGURATION
#####################
-Xms16G
-Xmx16G
#####################
# GC CONFIGURATION
#####################
-XX:+UseG1GC
-XX:MaxGCPauseMillis=500
-XX:InitiatingHeapOccupancyPercent=70
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4
-XX:+ParallelRefProcEnabled
-XX:MaxTenuringThreshold=1
-XX:G1HeapWastePercent=10
-XX:+UseStringDeduplication
#####################
# GC LOGGING
#####################
-Xlog:gc*:file=/var/log/cassandra/gc.log:time,uptime:filecount=10,filesize=10M
#####################
# MEMORY
#####################
-XX:MetaspaceSize=128M
-XX:MaxMetaspaceSize=256M
-XX:MaxDirectMemorySize=4G
-Xss256k
#####################
# ERROR HANDLING
#####################
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/lib/cassandra/
-XX:+ExitOnOutOfMemoryError
#####################
# PERFORMANCE
#####################
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-XX:+UseLargePages
WorkloadHeapGCKey Settings
Write-heavy16-24GBG1GCHigher IHOP (75%)
Read-heavy16-31GBG1GCLower pause target
Low latency16GBZGC-XX:+UseZGC
Mixed16GBG1GCDefault settings
Terminal window
# Check GC activity
nodetool gcstats
# Watch GC logs
tail -f /var/log/cassandra/gc.log