When running Java-based tools, use -XX:+TieredCompilation -XX:TieredStopAtLevel=1 instead of -client, as the latter is ignored on 64-bit JVMs since at least JDK 6.

The new flags have been shown to cut down CPU time by 50% due to reduced time spent in JIT and improving overall run time for short running actions, some times also cutting them in half.

Here's a benchmark of Bazel building itself, giving a nice 2-4x speedup:

./output/bazel clean && ./output/bazel build //src:bazel

Bazel before this change:
INFO: Elapsed time: 197.783s, Critical Path: 194.10s
INFO: Elapsed time: 198.928s, Critical Path: 195.65s
INFO: Elapsed time: 194.913s, Critical Path: 191.56s

Bazel before this change with --strategy=Javac=worker:
INFO: Elapsed time: 130.436s, Critical Path: 124.27s
INFO: Elapsed time: 116.114s, Critical Path: 112.30s
INFO: Elapsed time: 116.852s, Critical Path: 84.45s

Bazel with this change:
INFO: Elapsed time: 121.625s, Critical Path: 119.08s
INFO: Elapsed time: 119.401s, Critical Path: 115.80s
INFO: Elapsed time: 121.198s, Critical Path: 119.03s

Bazel with this change and --strategy=Javac=worker:
INFO: Elapsed time: 54.456s, Critical Path: 51.28s
INFO: Elapsed time: 53.272s, Critical Path: 51.09s
INFO: Elapsed time: 52.966s, Critical Path: 49.86s

Bazel with this change and --strategy=Javac=worker and stripping -XX:TieredStopAtLevel=1 from JVM flags when using workers:
INFO: Elapsed time: 61.599s, Critical Path: 58.93s
INFO: Elapsed time: 48.695s, Critical Path: 45.02s
INFO: Elapsed time: 46.874s, Critical Path: 43.91s
INFO: Elapsed time: 46.174s, Critical Path: 43.32s

(The latter is a possible optimization for workers and it's also nice to know that the limited tiered compilation does not hurt their performance.)

--
MOS_MIGRATED_REVID=125448089
diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh
index f0a797e..63a5777 100755
--- a/scripts/bootstrap/compile.sh
+++ b/scripts/bootstrap/compile.sh
@@ -266,8 +266,10 @@
 # bazel build using bootstrap version
 function bootstrap_build() {
   "${JAVA_HOME}/bin/java" \
-      -client -Xms256m -XX:NewRatio=4 -XX:+HeapDumpOnOutOfMemoryError -Xverify:none -Dfile.encoding=ISO-8859-1 \
-      -XX:HeapDumpPath=${OUTPUT_DIR} \
+      -XX:+TieredCompilation -XX:TieredStopAtLevel=1 \
+      -Xms256m -XX:NewRatio=4 -Xverify:none \
+      -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${OUTPUT_DIR} \
+      -Dfile.encoding=ISO-8859-1 \
       -Djava.util.logging.config.file=${OUTPUT_DIR}/javalog.properties \
       -Dio.bazel.UnixFileSystem=0 \
       -jar ${ARCHIVE_DIR}/libblaze.jar \
diff --git a/src/java_tools/buildjar/BUILD b/src/java_tools/buildjar/BUILD
index 56298df..dc16a42 100644
--- a/src/java_tools/buildjar/BUILD
+++ b/src/java_tools/buildjar/BUILD
@@ -54,7 +54,10 @@
     ijar = ["//third_party/ijar"],
     javabuilder = ["bootstrap_deploy.jar"],
     javac = ["//third_party/java/jdk/langtools:javac_jar"],
-    jvm_opts = ["-client"],
+    jvm_opts = [
+        "-XX:+TieredCompilation",
+        "-XX:TieredStopAtLevel=1",
+    ],
     singlejar = ["//src/java_tools/singlejar:bootstrap_deploy.jar"],
     source_version = "8",
     target_version = "8",
@@ -70,7 +73,10 @@
     ijar = ["//third_party/ijar"],
     javabuilder = ["//third_party/java/jdk/javabuilder:JavaBuilder_0.1.0"],
     javac = ["//third_party/java/jdk/langtools:javac7_jar"],
-    jvm_opts = ["-client"],
+    jvm_opts = [
+        "-XX:+TieredCompilation",
+        "-XX:TieredStopAtLevel=1",
+    ],
     singlejar = ["//src/java_tools/singlejar:bootstrap_deploy.jar"],
     source_version = "7",
     target_version = "7",
diff --git a/src/main/cpp/blaze.cc b/src/main/cpp/blaze.cc
index c706c37..b726ecf 100644
--- a/src/main/cpp/blaze.cc
+++ b/src/main/cpp/blaze.cc
@@ -413,7 +413,8 @@
       blaze_util::Dirname(blaze_util::Dirname(globals->jvm_path)),
       &result);
   if (globals->options.batch) {
-    result.push_back("-client");
+    result.push_back("-XX:+TieredCompilation");
+    result.push_back("-XX:TieredStopAtLevel=1");
     result.push_back("-Xms256m");
     result.push_back("-XX:NewRatio=4");
   } else {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
index 3e2b13a..425fb0e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
@@ -27,7 +27,6 @@
 import com.google.devtools.build.lib.util.Preconditions;
 
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 import javax.annotation.Nullable;
@@ -233,7 +232,8 @@
         outputJar, javaStartClass, deployManifestLines, buildInfoArtifacts, classpathResources,
         runtimeClasspath, includeBuildData, compression, launcher);
 
-    List<String> jvmArgs = ImmutableList.of("-client", SINGLEJAR_MAX_MEMORY);
+    ImmutableList<String> jvmArgs =
+        ImmutableList.of("-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", SINGLEJAR_MAX_MEMORY);
     ResourceSet resourceSet =
         ResourceSet.createWithRamCpuIo(/*memoryMb = */200.0, /*cpuUsage = */.2, /*ioUsage=*/.2);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index d0da0c4..6e90bae 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -340,25 +340,34 @@
    */
   public void createGenJarAction(Artifact classJar, Artifact manifestProto,
       Artifact genClassJar) {
-    getRuleContext().registerAction(new SpawnAction.Builder()
-      .addInput(manifestProto)
-      .addInput(classJar)
-      .addOutput(genClassJar)
-      .addTransitiveInputs(getHostJavabaseInputsNonStatic(getRuleContext()))
-      .setJarExecutable(
-          getRuleContext().getHostConfiguration().getFragment(Jvm.class).getJavaExecutable(),
-          getGenClassJar(ruleContext),
-          ImmutableList.of("-client", GENCLASS_MAX_MEMORY))
-      .setCommandLine(CustomCommandLine.builder()
-          .addExecPath("--manifest_proto", manifestProto)
-          .addExecPath("--class_jar", classJar)
-          .addExecPath("--output_jar", genClassJar)
-          .add("--temp_dir").addPath(tempDir(genClassJar))
-          .build())
-      .useParameterFile(ParameterFileType.SHELL_QUOTED)
-      .setProgressMessage("Building genclass jar " + genClassJar.prettyPrint())
-      .setMnemonic("JavaSourceJar")
-      .build(getRuleContext()));
+    ImmutableList<String> jvmOpts =
+        ImmutableList.of("-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", GENCLASS_MAX_MEMORY);
+    getRuleContext()
+        .registerAction(
+            new SpawnAction.Builder()
+                .addInput(manifestProto)
+                .addInput(classJar)
+                .addOutput(genClassJar)
+                .addTransitiveInputs(getHostJavabaseInputsNonStatic(getRuleContext()))
+                .setJarExecutable(
+                    getRuleContext()
+                        .getHostConfiguration()
+                        .getFragment(Jvm.class)
+                        .getJavaExecutable(),
+                    getGenClassJar(ruleContext),
+                    jvmOpts)
+                .setCommandLine(
+                    CustomCommandLine.builder()
+                        .addExecPath("--manifest_proto", manifestProto)
+                        .addExecPath("--class_jar", classJar)
+                        .addExecPath("--output_jar", genClassJar)
+                        .add("--temp_dir")
+                        .addPath(tempDir(genClassJar))
+                        .build())
+                .useParameterFile(ParameterFileType.SHELL_QUOTED)
+                .setProgressMessage("Building genclass jar " + genClassJar.prettyPrint())
+                .setMnemonic("JavaSourceJar")
+                .build(getRuleContext()));
   }
 
   /** Returns the GenClass deploy jar Artifact. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
index 642ec85..5dafe2a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
@@ -357,7 +357,9 @@
     JavaOptions host = (JavaOptions) getDefault();
 
     host.javaBase = hostJavaBase;
-    host.jvmOpts = ImmutableList.of("-client", "-XX:ErrorFile=/dev/stderr");
+    host.jvmOpts =
+        ImmutableList.of(
+            "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-XX:ErrorFile=/dev/stderr");
 
     host.javacOpts = javacOpts;
     host.javaToolchain = hostJavaToolchain;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
index db58862..4d20691 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
@@ -83,7 +83,10 @@
         The list of arguments for the JVM when invoking the Java compiler. Please refer to the Java
         virtual machine documentation for the extensive list of possible flags for this option.
         <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(attr("jvm_opts", STRING_LIST).value(ImmutableList.<String>of("-client")))
+        .add(
+            attr("jvm_opts", STRING_LIST)
+                .value(
+                    ImmutableList.<String>of("-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1")))
         /* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(javac) -->
         Label of the javac jar.
         <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
index 00b2477..59e41c0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
@@ -61,20 +61,20 @@
         ruleContext.getHostConfiguration().getFragment(Jvm.class).getJavaExecutable();
     NestedSet<Artifact> hostJavabaseInputs = JavaHelper.getHostJavabaseInputs(ruleContext);
     Artifact singleJar = getSingleJar(ruleContext);
-    ruleContext.registerAction(new SpawnAction.Builder()
-        .addOutput(outputJar)
-        .addInputs(resources.values())
-        .addInputs(resourceJars)
-        .addTransitiveInputs(hostJavabaseInputs)
-        .setJarExecutable(
-            javaPath,
-            singleJar,
-            ImmutableList.of("-client", SINGLEJAR_MAX_MEMORY))
-        .setCommandLine(sourceJarCommandLine(outputJar, resources, resourceJars))
-        .useParameterFile(ParameterFileType.SHELL_QUOTED)
-        .setProgressMessage("Building source jar " + outputJar.prettyPrint())
-        .setMnemonic("JavaSourceJar")
-        .build(ruleContext));
+    ImmutableList<String> jvmOpts =
+        ImmutableList.of("-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", SINGLEJAR_MAX_MEMORY);
+    ruleContext.registerAction(
+        new SpawnAction.Builder()
+            .addOutput(outputJar)
+            .addInputs(resources.values())
+            .addInputs(resourceJars)
+            .addTransitiveInputs(hostJavabaseInputs)
+            .setJarExecutable(javaPath, singleJar, jvmOpts)
+            .setCommandLine(sourceJarCommandLine(outputJar, resources, resourceJars))
+            .useParameterFile(ParameterFileType.SHELL_QUOTED)
+            .setProgressMessage("Building source jar " + outputJar.prettyPrint())
+            .setMnemonic("JavaSourceJar")
+            .build(ruleContext));
   }
 
   /** Returns the SingleJar deploy jar Artifact. */
diff --git a/tools/jdk/BUILD b/tools/jdk/BUILD
index 96581b0..a62f067 100644
--- a/tools/jdk/BUILD
+++ b/tools/jdk/BUILD
@@ -124,7 +124,10 @@
     ijar = ["@bazel_tools//tools/jdk:ijar"],
     javabuilder = ["//tools/jdk:JavaBuilder_deploy.jar"],
     javac = ["//third_party/java/jdk/langtools:javac_jar"],
-    jvm_opts = ["-client"],
+    jvm_opts = [
+        "-XX:+TieredCompilation",
+        "-XX:TieredStopAtLevel=1",
+    ],
     singlejar = ["//tools/jdk:SingleJar_deploy.jar"],
     source_version = "8",
     target_version = "8",