Cleanup JVM options

- Remove +UseCompressedOops (on by default on 64 bit JVM)
- Enabled +TieredCompilation as suggested by Ali
- ONOS_DEBUG mode outputs gc and compilation logs
- Output final JVM flags to stdout log file
- Cosmetic fixes

Change-Id: I4128f54b75aa59ad4da781cadb9a4ae1791184d3
diff --git a/onos.sh b/onos.sh
index 574c223..1db93d5 100755
--- a/onos.sh
+++ b/onos.sh
@@ -104,7 +104,9 @@
 # Set JVM options
 JVM_OPTS="${JVM_OPTS:-}"
 JVM_OPTS="$JVM_OPTS -server -d64"
-#JVM_OPTS="$JVM_OPTS -XX:+TieredCompilation -XX:InitialCodeCacheSize=512m -XX:ReservedCodeCacheSize=512m"
+
+# TODO Revisit appropriate CodeCache size
+JVM_OPTS="$JVM_OPTS -XX:+TieredCompilation -XX:InitialCodeCacheSize=512m -XX:ReservedCodeCacheSize=512m"
 
 # Uncomment or specify appropriate value as JVM_OPTS environment variables.
 #JVM_OPTS="$JVM_OPTS -Xmx4g -Xms4g -Xmn800m"
@@ -113,16 +115,24 @@
 
 #JVM_OPTS="$JVM_OPTS -XX:+UseParallelGC"
 JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
+#JVM_OPTS="$JVM_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
+# Note: shoult NOT specify -Xmn when using G1GC
+#  http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html
+
 JVM_OPTS="$JVM_OPTS -XX:+AggressiveOpts"
 
-# We may want to remove UseFastAccessorMethods option: http://bugs.java.com/view_bug.do?bug_id=6385687
+# TODO We may want to remove UseFastAccessorMethods option: http://bugs.java.com/view_bug.do?bug_id=6385687
 JVM_OPTS="$JVM_OPTS -XX:+UseFastAccessorMethods"
 
+# TODO revisit these derived from floodlight
 JVM_OPTS="$JVM_OPTS -XX:MaxInlineSize=8192"
 JVM_OPTS="$JVM_OPTS -XX:FreqInlineSize=8192"
 JVM_OPTS="$JVM_OPTS -XX:CompileThreshold=1500"
 
+# FIXME Specify appropriate cmd to handle fatal crash
+#  http://www.oracle.com/technetwork/java/javase/clopts-139448.html#gbmum
 JVM_OPTS="$JVM_OPTS -XX:OnError=crash-logger" ;# For dumping core
+#JVM_OPTS="$JVM_OPTS -XX:+ShowMessageBoxOnError"
 
 # This option tells the VM to generate a heap dump when memory allocation cannot be satisfied.
 # http://www.oracle.com/technetwork/java/javase/clopts-139448.html#gbzrr
@@ -131,8 +141,6 @@
 # Workaround for Thread Priority http://tech.stolsvik.com/2010/01/linux-java-thread-priorities-workaround.html
 JVM_OPTS="$JVM_OPTS -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42"
 
-JVM_OPTS="$JVM_OPTS -XX:+UseCompressedOops"
-
 JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT"
 JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"
 JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
@@ -148,8 +156,26 @@
 JVM_OPTS="$JVM_OPTS -Dhazelcast.socket.send.buffer.size=4096"
 
 
-# Uncomment to dump final JVM flags to stdout
-#JVM_OPTS="$JVM_OPTS -XX:+PrintFlagsFinal"
+if [ "${ONOS_DEBUG}" == "true" ]; then
+  # Compilation diagnosis
+  JVM_OPTS="$JVM_OPTS -XX:+UnlockDiagnosticVMOptions"
+  JVM_OPTS="$JVM_OPTS -XX:+LogCompilation"
+  JVM_OPTS="$JVM_OPTS -XX:LogFile=${LOGDIR}/compilation.${ONOS_HOST_NAME}.log"
+
+  # GC diagnosis
+  JVM_OPTS="$JVM_OPTS -verbose:gc"
+  JVM_OPTS="$JVM_OPTS -verbose:sizes"
+  JVM_OPTS="$JVM_OPTS -Xloggc:${LOGDIR}/gc.${ONOS_HOST_NAME}.log"
+  JVM_OPTS="$JVM_OPTS -XX:GCLogFileSize=1G"
+  JVM_OPTS="$JVM_OPTS -XX:+PrintGCDetails"
+  JVM_OPTS="$JVM_OPTS -XX:+PrintGCTimeStamps"
+  JVM_OPTS="$JVM_OPTS -XX:+PrintGCDateStamps"
+  JVM_OPTS="$JVM_OPTS -XX:+PrintTenuringDistribution"
+  JVM_OPTS="$JVM_OPTS -XX:+PrintCMSInitiationStatistics"
+fi
+
+# dump final JVM flags to stdout
+JVM_OPTS="$JVM_OPTS -XX:+PrintFlagsFinal"
 
 # Set ONOS core main class
 MAIN_CLASS="net.onrc.onos.core.main.Main"
@@ -988,7 +1014,7 @@
   fi
 
   # check for jvm debug flag
-  if [ "${ONOS_DEBUG}" = "true" ]; then
+  if [ "${ONOS_DEBUG}" == "true" ]; then
     JVM_OPTS="${JVM_OPTS} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${JVM_DEBUG_PORT}"
   fi