diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index cef0efbdf1..17c2fb870d 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -151,18 +151,19 @@ if [ "x$CASSANDRA_HEAPDUMP_DIR" != "x" ]; then JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=$CASSANDRA_HEAPDUMP_DIR/cassandra-`date +%s`-pid$$.hprof" fi +java_version=`"${JAVA:-java}" -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[0-9]+\.[0-9]+'` if [ "`uname`" = "Linux" ] ; then - java_version=`"${JAVA:-java}" -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[0-9]+\.[0-9]+'` + # try to determine JVM stack minimum by using too-small stack + # (note that 16k causes segfault and smaller prints invalid size error) + java_min_stack=`"${JAVA:-java}" -Xss32k 2>&1 | sed -nr 's/The stack size specified is too small, Specify at least ([0-9]+k)/\1/p'` # reduce the per-thread stack size to minimize the impact of Thrift # thread-per-client. (Best practice is for client connections to # be pooled anyway.) Only do so on Linux where it is known to be # supported. - if [ "$java_version" = "1.7" ] + if [ -n "$java_min_stack" ] then - JVM_OPTS="$JVM_OPTS -Xss160k" - else - JVM_OPTS="$JVM_OPTS -Xss128k" + JVM_OPTS="$JVM_OPTS -Xss$java_min_stack" fi fi echo "xss = $JVM_OPTS"