From 74cb8c7d6ae2462006e983b8baafd50c884d1d8d Mon Sep 17 00:00:00 2001 From: Philipp Wollermann Date: Fri, 15 Jul 2016 14:01:37 +0000 Subject: 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 --- .../lib/rules/java/JavaCompilationHelper.java | 56 +++++++++++----------- .../rules/java/JavaHeaderCompileActionBuilder.java | 2 +- .../devtools/build/lib/rules/java/JavaOptions.java | 3 +- .../build/lib/rules/java/JavaToolchainData.java | 6 +-- .../lib/rules/java/JavaToolchainProvider.java | 14 +++--- .../build/lib/rules/java/JavaToolchainRule.java | 3 +- .../lib/rules/java/SingleJarActionBuilder.java | 35 ++++++-------- 7 files changed, 56 insertions(+), 63 deletions(-) (limited to 'src/main/java/com/google/devtools') 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 21b94c9883..97a05f26e3 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.rules.test.InstrumentedFilesCollector; 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 @@ import javax.annotation.Nullable; */ 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 customJavacOpts; @@ -76,7 +69,7 @@ public final class JavaCompilationHelper extends BaseJavaCompilationHelper { 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 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())); + 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 @@ public final class JavaCompilationHelper extends BaseJavaCompilationHelper { 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 0d0a53f4c3..8fb7823861 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 @@ public class JavaHeaderCompileActionBuilder { ":java_toolchain" + implicitAttributesSuffix, Mode.TARGET, JavaToolchainProvider.class); List jvmArgs = ImmutableList.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 745aaf8dc3..d09339f056 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.Converters.StringSetConverter; 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 @@ 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: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 ba6c3dc725..7abf6c1504 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.base.Joiner; 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 @@ public class JavaToolchainData { } /** - * @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 getJavacJvmOptions() { + public ImmutableList 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 7ba9c78f73..3190fe7e5b 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.RuleContext; 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 @@ public final class JavaToolchainProvider implements TransitiveInfoProvider { private final NestedSet extclasspath; private final String encoding; private final ImmutableList javacOptions; - private final ImmutableList javacJvmOptions; + private final ImmutableList jvmOptions; private final boolean javacSupportsWorkers; private final Artifact javac; private final Artifact javaBuilder; @@ -89,7 +87,7 @@ public final class JavaToolchainProvider implements TransitiveInfoProvider { .addAll(data.getJavacOptions()) .addAll(defaultJavacFlags) .build(); - this.javacJvmOptions = data.getJavacJvmOptions(); + this.jvmOptions = data.getJvmOptions(); this.javacSupportsWorkers = data.getJavacSupportsWorkers(); } @@ -98,9 +96,11 @@ public final class JavaToolchainProvider implements TransitiveInfoProvider { return javacOptions; } - /** @return the list of default options for the JVM running the java compiler */ - public ImmutableList getJavacJvmOptions() { - return javacJvmOptions; + /** + * @return the list of default options for the JVM running the java compiler and associated tools. + */ + public ImmutableList 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 c50fe4c07f..10de249433 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.analysis.RuleDefinitionEnvironment; 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 @@ 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. */ - .add(attr("jvm_opts", STRING_LIST).value(ImmutableList.of("-client"))) + .add(attr("jvm_opts", STRING_LIST).value(ImmutableList.of())) /* True if JavaBuilder supports running as a persistent worker, false if it doesn't. */ 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..69544f3931 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.analysis.actions.SpawnAction; 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 @@ import java.util.Map; */ @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 SOURCE_JAR_COMMAND_LINE_ARGS = ImmutableList.of( "--compression", @@ -61,20 +55,21 @@ public final class SingleJarActionBuilder { ruleContext.getHostConfiguration().getFragment(Jvm.class).getJavaExecutable(); NestedSet 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. */ -- cgit v1.2.3