stryker4s icon indicating copy to clipboard operation
stryker4s copied to clipboard

OutOfMemoryError during setup

Open cbrunnkvist opened this issue 3 years ago • 1 comments

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

cbrunnkvist avatar Aug 19 '21 08:08 cbrunnkvist

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)?

hugo-vrijswijk avatar Aug 23 '21 20:08 hugo-vrijswijk

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?

hugo-vrijswijk avatar Oct 19 '23 13:10 hugo-vrijswijk