stryker4s
stryker4s copied to clipboard
OutOfMemoryError during setup
Summary
Some projects, with thousands of mutants, take a long time to start and then fail due to OOM.
[info] Found 115 of 146 file(s) to be mutated.
[info] 3730 Mutant(s) generated. Of which 1771 Mutant(s) are excluded.
[info] Setting up mutated environment...
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
| => aat java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.HomParser.toString(Parser.scala:706)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.HomParser.toString(Parser.scala:706)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.ParserWithExamples.toString(Parser.scala:884)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.MapParser.toString(Parser.scala:770)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.SeqParser.toString(Parser.scala:698)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.MapParser.toString(Parser.scala:770)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.SeqParser.toString(Parser.scala:698)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.TypeFunctions.const(TypeFunctions.scala:27)
at sbt.internal.util.TypeFunctions.const$(TypeFunctions.scala:27)
at sbt.internal.util.Types$.const(Types.scala:10)
at sbt.Def$.toSParser(Def.scala:207)
at net.virtualvoid.sbt.graph.DependencyGraphSettings$.$anonfun$renderingTaskSettings$4(DependencyGraphSettings.scala:136)
at net.virtualvoid.sbt.graph.DependencyGraphSettings$$$Lambda$4960/1622047986.apply(Unknown Source)
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
| => aat java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.HomParser.toString(Parser.scala:706)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.HomParser.toString(Parser.scala:706)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.ParserWithExamples.toString(Parser.scala:884)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.MapParser.toString(Parser.scala:770)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.SeqParser.toString(Parser.scala:698)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.MapParser.toString(Parser.scala:770)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.complete.SeqParser.toString(Parser.scala:698)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at sbt.internal.util.TypeFunctions.const(TypeFunctions.scala:27)
at sbt.internal.util.TypeFunctions.const$(TypeFunctions.scala:27)
at sbt.internal.util.Types$.const(Types.scala:10)
at sbt.Def$.toSParser(Def.scala:207)
at net.virtualvoid.sbt.graph.DependencyGraphSettings$.$anonfun$renderingTaskSettings$4(DependencyGraphSettings.scala:136)
at net.virtualvoid.sbt.graph.DependencyGraphSettings$$$Lambda$4960/1622047986.apply(Unknown Source)
[error] [launcher] error during sbt launcher: java.lang.OutOfMemoryError: GC overhead limit exceeded
That is arguably a quite large amount of mutants - but we should be able to catch the OOM to print some helpful warnings, or as soon as we know all the variables (=number of mutants, number of files, available memory), warn that some mem params might need adjustment in order for parsing to work.
Stryker4s config
Nothing uncommon: excluding a bunch of files, including src/main/scala/**/*.scala
, excluding "StringLiteral"-mutations.
Your Environment
software | version(s) |
---|---|
Scala version | 2.12 |
Build tool & version | sbt 1.5.5, java 8 |
Operating System | macOS Big Sur |
Very interesting! 3700 mutants is definitely a lot, but not so much that we should OOM on a decent machine. I'd be very interested to find out where the heap buildup comes from. Is there any chance you could debug Stryker4s running on the project with a memory profiler and share some results (or insights)?
0.15.0 should be a lot more efficient when gathering mutants. Could you let me know if this is still an issue on v0.15.0?