com.cenqua.clover.CoverageData$TestHits.getSlicesFor
In some extreme cases, (> 10K test cases), clover-report can take a very long time to run.
Investigate possibilities of optimizing the crunching of clover's per-test coverage data.
Below is a thread dump of a slow clover-report:
Full thread dump Java HotSpot(TM) 64-Bit Server VM (1.5.0_06-b05 mixed mode): "Clover-Thread-118" prio=1 tid=0x0000002be6f4c7c0 nid=0x5176 runnable [0x0000000041060000..0x0000000041060d30] at java.util.BitSet.nextSetBit(BitSet.java:563) at com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3 30) at com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144) at com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176) at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at clover.org.apache.velocity.util.introspection.UberspectImpl$VelMethodImp l.invoke(UberspectImpl.java:295) at clover.org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMeth od.java:245) at clover.org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTR eference.java:203) at clover.org.apache.velocity.runtime.parser.node.ASTReference.value(ASTRef erence.java:419) at clover.org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTEx pression.java:73) at clover.org.apache.velocity.runtime.parser.node.ASTSetDirective.render(AS TSetDirective.java:125) at clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock. java:74) at clover.org.apache.velocity.runtime.parser.node.ASTIfStatement.render(AST IfStatement.java:88) at clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock. java:74) at clover.org.apache.velocity.runtime.directive.Foreach.render(Foreach.java :448) at clover.org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDi rective.java:170) at clover.org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleN ode.java:318) at clover.org.apache.velocity.Template.merge(Template.java:254) at clover.org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngi ne.java:508) at com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html ReportUtil.java:67) at com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html ReportUtil.java:83) at com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio n.java:136) at com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction. java:104) at com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut ors.java:88) at clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut ureTask.java:176) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:987) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:528) at clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp ers$1.run(ThreadHelpers.java:34) at java.lang.Thread.run(Thread.java:595) "Clover-Thread-117" prio=1 tid=0x0000002be38ccff0 nid=0x5175 runnable [0x0000000041464000..0x0000000041464cb0] at java.util.BitSet.nextSetBit(BitSet.java:563) at com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3 30) at com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144) at com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176) at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at clover.org.apache.velocity.util.introspection.UberspectImpl$VelMethodImp l.invoke(UberspectImpl.java:295) at clover.org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMeth od.java:245) at clover.org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTR eference.java:203) at clover.org.apache.velocity.runtime.parser.node.ASTReference.value(ASTRef erence.java:419) at clover.org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTEx pression.java:73) at clover.org.apache.velocity.runtime.parser.node.ASTSetDirective.render(AS TSetDirective.java:125) at clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock. java:74) at clover.org.apache.velocity.runtime.parser.node.ASTIfStatement.render(AST IfStatement.java:88) at clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock. java:74) at clover.org.apache.velocity.runtime.directive.Foreach.render(Foreach.java :448) at clover.org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDi rective.java:170) at clover.org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleN ode.java:318) at clover.org.apache.velocity.Template.merge(Template.java:254) at clover.org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngi ne.java:508) at com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html ReportUtil.java:67) at com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html ReportUtil.java:83) at com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio n.java:136) at com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction. java:104) at com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut ors.java:88) at clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut ureTask.java:176) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:987) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:528) at clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp ers$1.run(ThreadHelpers.java:34) at java.lang.Thread.run(Thread.java:595) "Clover-Thread-116" prio=1 tid=0x0000002be65a3c90 nid=0x5174 runnable [0x0000000041565000..0x0000000041565c30] at java.util.BitSet.nextSetBit(BitSet.java:563) at com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3 30) at com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144) at com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176) at com.cenqua.clover.reporters.html.RenderFileAction.insertSrcFilePropertie s(RenderFileAction.java:174) at com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio n.java:122) at com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction. java:104) at com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut ors.java:88) at clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut ureTask.java:176) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:987) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:528) at clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp ers$1.run(ThreadHelpers.java:34) at java.lang.Thread.run(Thread.java:595) "Clover-Thread-115" prio=1 tid=0x0000002be43ce670 nid=0x5173 runnable [0x0000000041867000..0x0000000041868bb0] at java.util.BitSet.nextSetBit(BitSet.java:563) at com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3 30) at com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144) at com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176) at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at clover.org.apache.velocity.util.introspection.UberspectImpl$VelMethodImp l.invoke(UberspectImpl.java:295) at clover.org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMeth od.java:245) at clover.org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTR eference.java:203) at clover.org.apache.velocity.runtime.parser.node.ASTReference.value(ASTRef erence.java:419) at clover.org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTEx pression.java:73) at clover.org.apache.velocity.runtime.parser.node.ASTSetDirective.render(AS TSetDirective.java:125) at clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock. java:74) at clover.org.apache.velocity.runtime.parser.node.ASTIfStatement.render(AST IfStatement.java:88) at clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock. java:74) at clover.org.apache.velocity.runtime.directive.Foreach.render(Foreach.java :448) at clover.org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDi rective.java:170) at clover.org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleN ode.java:318) at clover.org.apache.velocity.Template.merge(Template.java:254) at clover.org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngi ne.java:508) at com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html ReportUtil.java:67) at com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html ReportUtil.java:83) at com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio n.java:136) at com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction. java:104) at com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut ors.java:88) at clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut ureTask.java:176) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:987) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:528) at clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp ers$1.run(ThreadHelpers.java:34) at java.lang.Thread.run(Thread.java:595) "Java2D Disposer" daemon prio=1 tid=0x0000002be46dfec0 nid=0x5170 in Object.wait() [0x0000000041e6e000..0x0000000041e6eb30] at java.lang.Object.wait(Native Method) - waiting on <0x0000002b5646cd28> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) - locked <0x0000002b5646cd28> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) at sun.java2d.Disposer.run(Disposer.java:107) at java.lang.Thread.run(Thread.java:595) "Low Memory Detector" daemon prio=1 tid=0x0000002be051ac60 nid=0x7a9c runnable [0x0000000000000000..0x0000000000000000] "CompilerThread1" daemon prio=1 tid=0x0000002be05190d0 nid=0x7a9b waiting on condition [0x0000000000000000..0x0000000040c5b560] "CompilerThread0" daemon prio=1 tid=0x0000002be0517bc0 nid=0x7a9a waiting on condition [0x0000000000000000..0x0000000040b5a500] "AdapterThread" daemon prio=1 tid=0x0000002be0516500 nid=0x7a99 waiting on condition [0x0000000000000000..0x0000000000000000] "Signal Dispatcher" daemon prio=1 tid=0x0000002be05093a0 nid=0x7a98 waiting on condition [0x0000000000000000..0x0000000000000000] "Finalizer" daemon prio=1 tid=0x0000002be0500f80 nid=0x7a97 in Object.wait() [0x0000000040858000..0x0000000040858e30] at java.lang.Object.wait(Native Method) - waiting on <0x0000002adfc9a490> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) - locked <0x0000002adfc9a490> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) "Reference Handler" daemon prio=1 tid=0x0000002be0500730 nid=0x7a96 in Object.wait() [0x0000000040757000..0x0000000040757db0] at java.lang.Object.wait(Native Method) - waiting on <0x0000002adf680588> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:474) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) - locked <0x0000002adf680588> (a java.lang.ref.Reference$Lock) "main" prio=1 tid=0x0000000040115bb0 nid=0x7a8f in Object.wait() [0x0000007fbfffc000..0x0000007fbfffd150] at java.lang.Object.wait(Native Method) - waiting on <0x0000002b77b68eb0> (a clover.edu.emory.mathcs.backport.java.util.concurrent.locks.CondVar) at java.lang.Object.wait(Object.java:432) at clover.edu.emory.mathcs.backport.java.util.concurrent.TimeUnit.timedWait (TimeUnit.java:364) at clover.edu.emory.mathcs.backport.java.util.concurrent.locks.CondVar.awai t(CondVar.java:99) - locked <0x0000002b77b68eb0> (a clover.edu.emory.mathcs.backport.java.util.concurrent.locks.CondVar) at clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor .awaitTermination(ThreadPoolExecutor.java:1305) at com.cenqua.clover.util.CloverExecutors$CloverExecutorService.awaitTermin ation(CloverExecutors.java:64) at com.cenqua.clover.reporters.html.FullHtmlReporter.createCurrentReportImp l(FullHtmlReporter.java:348) at com.cenqua.clover.reporters.html.HtmlReporter.createCurrentReport(HtmlRe porter.java:106) at com.cenqua.clover.reporters.html.HtmlReporter.generateCurrentReport(Html Reporter.java:75) at com.cenqua.clover.reporters.html.HtmlReporter.generateReport(HtmlReporte r.java:64) at com.cenqua.clover.reporters.CloverReporter.generateReport(CloverReporter .java:30) at com.cenqua.clover.tasks.CloverReportTask.generateReports(CloverReportTas k.java:408) at com.cenqua.clover.tasks.CloverReportTask.cloverExecute(CloverReportTask. java:369) at com.cenqua.clover.tasks.AbstractCloverTask.execute(AbstractCloverTask.ja va:47) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:1 06) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:357) at org.apache.tools.ant.Target.performTasks(Target.java:385) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) at org.apache.tools.ant.Project.executeTarget(Project.java:1306) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecut or.java:41) at org.apache.tools.ant.Project.executeTargets(Project.java:1189) at org.apache.tools.ant.Main.runBuild(Main.java:758) at org.apache.tools.ant.Main.startAnt(Main.java:217) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) "VM Thread" prio=1 tid=0x0000002be04fc3b0 nid=0x7a95 runnable "GC task thread#0 (ParallelGC)" prio=1 tid=0x0000000040133770 nid=0x7a91 runnable "GC task thread#1 (ParallelGC)" prio=1 tid=0x0000000040134560 nid=0x7a92 runnable "GC task thread#2 (ParallelGC)" prio=1 tid=0x0000000040135350 nid=0x7a93 runnable "GC task thread#3 (ParallelGC)" prio=1 tid=0x0000000040136140 nid=0x7a94 runnable "VM Periodic Task Thread" prio=1 tid=0x0000002be051c810 nid=0x7a9d waiting on condition