$cassandra_home/conf/cassandra-env.sh

calculate_heap_sizes()
{
	case "`uname`" in
	    Linux)
	        system_memory_in_mb=`free -m | awk '/:/ {print $2;exit}'`
	        system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
	    ;;
	    FreeBSD)
	        system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
	        system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
	        system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
	    ;;
	    SunOS)
	        system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
	        system_cpu_cores=`psrinfo | wc -l`
	    ;;
	    Darwin)
	        system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
	        system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
	        system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
	    ;;
	    *)
	        # assume reasonable defaults for e.g. a modern desktop or
	        # cheap server
	        system_memory_in_mb="2048"
	        system_cpu_cores="2"
	    ;;
	esac

	# some systems like the raspberry pi don't report cores, use at least 1
	if [ "$system_cpu_cores" -lt "1" ]
	then
	    system_cpu_cores="1"
	fi
	
	# set max heap size based on the following
	# max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
	# calculate 1/2 ram and cap to 1024MB
	# calculate 1/4 ram and cap to 8192MB
	# pick the max
	half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
	quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
	if [ "$half_system_memory_in_mb" -gt "1024" ]
	then
	    half_system_memory_in_mb="1024"
	fi
	if [ "$quarter_system_memory_in_mb" -gt "8192" ]
	then
	    quarter_system_memory_in_mb="8192"
	fi
	if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
	then
	    max_heap_size_in_mb="$half_system_memory_in_mb"
	else
	    max_heap_size_in_mb="$quarter_system_memory_in_mb"
	fi
	MAX_HEAP_SIZE="${max_heap_size_in_mb}M"

	# Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
	max_sensible_yg_per_core_in_mb="100"
	max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores`

	desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`

	if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
	then
	    HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
	else
	    HEAP_NEWSIZE="${desired_yg_in_mb}M"
	fi
}