diff options
author | 2016-06-21 14:18:40 +0000 | |
---|---|---|
committer | 2016-06-21 14:47:56 +0000 | |
commit | c20091450f48b34c909716452767312cfb8f2fc4 (patch) | |
tree | 30870ddac16afadac22ec2c1eb80570ebd692043 /src/main/java/com/google/devtools/build/lib/rules | |
parent | 24ec1bfa0b9ed78ce5ce7b7e90612f24a60d2a54 (diff) |
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
5 files changed, 51 insertions, 37 deletions
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 3e2b13ae58..425fb0eac5 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.collect.IterablesChain; 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 @@ public class DeployArchiveBuilder { 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 d0da0c420a..6e90bae2cd 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 final class JavaCompilationHelper extends BaseJavaCompilationHelper { */ 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 642ec850a2..5dafe2a6e6 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 @@ public class JavaOptions extends FragmentOptions { 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 db588621f1..4d20691236 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 @@ public final class JavaToolchainRule implements RuleDefinition { 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 00b24779a5..59e41c04a7 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 @@ public final class SingleJarActionBuilder { 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. */ |