When running Javac and related 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.

--
MOS_MIGRATED_REVID=127536578
diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh
index ff81f27..1714cda 100755
--- a/scripts/bootstrap/compile.sh
+++ b/scripts/bootstrap/compile.sh
@@ -266,7 +266,7 @@
 # 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:+HeapDumpOnOutOfMemoryError -Xverify:none -Dfile.encoding=ISO-8859-1 \
       -XX:HeapDumpPath=${OUTPUT_DIR} \
       -Djava.util.logging.config.file=${OUTPUT_DIR}/javalog.properties \
       -Dio.bazel.EnableJni=0 \
diff --git a/src/java_tools/buildjar/BUILD b/src/java_tools/buildjar/BUILD
index 5c379c0..880c13d 100644
--- a/src/java_tools/buildjar/BUILD
+++ b/src/java_tools/buildjar/BUILD
@@ -56,7 +56,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",
@@ -72,7 +75,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/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index 21b94c9..97a05f2 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
@@ -38,13 +38,11 @@
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-
 import javax.annotation.Nullable;
 
 /**
@@ -55,11 +53,6 @@
  */
 public final class JavaCompilationHelper extends BaseJavaCompilationHelper {
 
-  /**
-   * Maximum memory to use for GenClass for generating the gen jar.
-   */
-  private static final String GENCLASS_MAX_MEMORY = "-Xmx64m";
-
   private JavaTargetAttributes.Builder attributes;
   private JavaTargetAttributes builtAttributes;
   private final ImmutableList<String> customJavacOpts;
@@ -76,7 +69,7 @@
     this.implicitAttributesSuffix = implicitAttributesSuffix;
     this.attributes = attributes;
     this.customJavacOpts = javacOpts;
-    this.customJavacJvmOpts = javaToolchain.getJavacJvmOptions();
+    this.customJavacJvmOpts = javaToolchain.getJvmOptions();
     this.semantics = semantics;
   }
 
@@ -353,25 +346,32 @@
    */
   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()));
+    getRuleContext()
+        .registerAction(
+            new SpawnAction.Builder()
+                .addInput(manifestProto)
+                .addInput(classJar)
+                .addOutput(genClassJar)
+                .addTransitiveInputs(getHostJavabaseInputsNonStatic(getRuleContext()))
+                .setJarExecutable(
+                    getRuleContext()
+                        .getHostConfiguration()
+                        .getFragment(Jvm.class)
+                        .getJavaExecutable(),
+                    getGenClassJar(ruleContext),
+                    javaToolchain.getJvmOptions())
+                .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. */
@@ -441,7 +441,7 @@
     builder.setClassDirectory(classDir(resourceJar));
     builder.setJavaBuilderJar(javaToolchain.getJavaBuilder());
     builder.setJavacOpts(getDefaultJavacOptsFromRule(getRuleContext()));
-    builder.setJavacJvmOpts(javaToolchain.getJavacJvmOptions());
+    builder.setJavacJvmOpts(javaToolchain.getJvmOptions());
     getAnalysisEnvironment().registerAction(builder.build());
     return resourceJar;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java
index 0d0a53f..8fb7823 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java
@@ -269,7 +269,7 @@
             ":java_toolchain" + implicitAttributesSuffix, Mode.TARGET, JavaToolchainProvider.class);
     List<String> jvmArgs =
         ImmutableList.<String>builder()
-            .addAll(javaToolchain.getJavacJvmOptions())
+            .addAll(javaToolchain.getJvmOptions())
             .add("-Xbootclasspath/p:" + javacJar.getExecPath().getPathString())
             .build();
     builder.setJarExecutable(
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 745aaf8..d09339f 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
@@ -30,7 +30,6 @@
 import com.google.devtools.common.options.EnumConverter;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.TriState;
-
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -366,7 +365,7 @@
     JavaOptions host = (JavaOptions) getDefault();
 
     host.javaBase = hostJavaBase;
-    host.jvmOpts = ImmutableList.of("-client", "-XX:ErrorFile=/dev/stderr");
+    host.jvmOpts = ImmutableList.of("-XX:ErrorFile=/dev/stderr");
 
     host.javacOpts = javacOpts;
     host.javaToolchain = hostJavaToolchain;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java
index ba6c3dc..7abf6c1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainData.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-
 import java.util.List;
 
 /**
@@ -87,9 +86,10 @@
   }
 
   /**
-   * @return the list of options to be given to the JVM when invoking the java compiler.
+   * @return the list of options to be given to the JVM when invoking the java compiler and
+   *     associated tools.
    */
-  public ImmutableList<String> getJavacJvmOptions() {
+  public ImmutableList<String> getJvmOptions() {
     return jvmOpts;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
index 7ba9c78..3190fe7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
@@ -24,9 +24,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-
 import java.util.List;
-
 import javax.annotation.Nullable;
 
 /**
@@ -46,7 +44,7 @@
   private final NestedSet<Artifact> extclasspath;
   private final String encoding;
   private final ImmutableList<String> javacOptions;
-  private final ImmutableList<String> javacJvmOptions;
+  private final ImmutableList<String> jvmOptions;
   private final boolean javacSupportsWorkers;
   private final Artifact javac;
   private final Artifact javaBuilder;
@@ -89,7 +87,7 @@
             .addAll(data.getJavacOptions())
             .addAll(defaultJavacFlags)
             .build();
-    this.javacJvmOptions = data.getJavacJvmOptions();
+    this.jvmOptions = data.getJvmOptions();
     this.javacSupportsWorkers = data.getJavacSupportsWorkers();
   }
 
@@ -98,9 +96,11 @@
     return javacOptions;
   }
 
-  /** @return the list of default options for the JVM running the java compiler */
-  public ImmutableList<String> getJavacJvmOptions() {
-    return javacJvmOptions;
+  /**
+   * @return the list of default options for the JVM running the java compiler and associated tools.
+   */
+  public ImmutableList<String> getJvmOptions() {
+    return jvmOptions;
   }
 
   /** @return whether JavaBuilders supports running as a persistent worker or not */
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 c50fe4c..10de249 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
@@ -29,7 +29,6 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder;
 import com.google.devtools.build.lib.util.FileTypeSet;
-
 import java.util.List;
 
 /**
@@ -84,7 +83,7 @@
         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()))
         /* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(javac_supports_workers) -->
         True if JavaBuilder supports running as a persistent worker, false if it doesn't.
         <!-- #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..69544f3 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
@@ -24,7 +24,6 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import java.util.Collection;
 import java.util.Map;
 
@@ -35,11 +34,6 @@
  */
 @Immutable
 public final class SingleJarActionBuilder {
-  /**
-   * Also see DeployArchiveBuilder.SINGLEJAR_MAX_MEMORY. We don't expect that anyone has more
-   * than ~500,000 files in a source jar, so 256 MB of memory should be plenty.
-   */
-  private static final String SINGLEJAR_MAX_MEMORY = "-Xmx256m";
 
   private static final ImmutableList<String> SOURCE_JAR_COMMAND_LINE_ARGS = ImmutableList.of(
       "--compression",
@@ -61,20 +55,21 @@
         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));
+    ruleContext.registerAction(
+        new SpawnAction.Builder()
+            .addOutput(outputJar)
+            .addInputs(resources.values())
+            .addInputs(resourceJars)
+            .addTransitiveInputs(hostJavabaseInputs)
+            .setJarExecutable(
+                javaPath,
+                singleJar,
+                JavaToolchainProvider.fromRuleContext(ruleContext).getJvmOptions())
+            .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",