Regression (b92): OOM on filter/limit operation on unbound/parallel stream

Aleksey Shipilev aleksey.shipilev at oracle.com
Tue Jun 4 07:46:18 PDT 2013


On 06/04/2013 06:17 PM, Paul Sandoz wrote:
> If i run using interpretive mode -Xint, it works fine, suggesting we 
> are running into a hotspot issue, perhaps a hotspot/GC issue:

I had reproduced this as well, and seeing
  java.util.stream.SliceOps$SliceTask ->
  java.util.Spliterators$LongArraySpliterator ->
  long[]

...occupying the most of the heap (3 Gb on my machine). It passes with
-Xmx7g without problems. With lower heaps, it does a series of full GC,
which end up with:

[Full GC (Ergonomics) [PSYoungGen: 557248K->555317K(901760K)]
[ParOldGen: 4190056K->4190056K(4194304K)] 4747304K->4745374K(5096064K),
[Metaspace: 4142K->4702K(110592K)], 0.0800150 secs] [Times: user=0.19
sys=0.00, real=0.08 secs]
[Full GC (Ergonomics) [PSYoungGen: 557248K->0K(901760K)] [ParOldGen:
4190056K->20912K(1710848K)] 4747304K->20912K(2612608K), [Metaspace:
4144K->4702K(110592K)], 0.2308390 secs] [Times: user=0.15 sys=0.16,
real=0.23 secs]

...so the heap appears to be empty. The application is still munching
through data in the main thread, which explains why there is no
parallelism happening:

"main" #1 prio=5 os_prio=0 tid=0x00007fa290009800 nid=0x7342 runnable
[0x00007fa298ed1000]
   java.lang.Thread.State: RUNNABLE
	at java.util.stream.Nodes$SpinedNodeBuilder.accept(Nodes.java:1248)
	at
java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
	at java.util.stream.LongPipeline$3$1.accept(LongPipeline.java:230)
	at
java.util.PrimitiveIterator$OfLong.forEachRemaining(PrimitiveIterator.java:166)
	at java.util.stream.LongStream$1.forEachRemaining(LongStream.java)
	at
java.util.Spliterators$LongIteratorSpliterator.forEachRemaining(Spliterators.java:2029)
	at java.util.Spliterator$OfLong.forEachRemaining(Spliterator.java:744)
	at
java.util.Spliterators$LongIteratorSpliterator.forEachRemaining(Spliterators.java)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at
java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.SliceOps$SliceTask.doLeaf(SliceOps.java:606)
	at java.util.stream.SliceOps$SliceTask.doLeaf(SliceOps.java:553)
	at java.util.stream.AbstractTask.compute(AbstractTask.java:312)
	at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:710)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:385)
	at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:717)
	at java.util.stream.SliceOps$1.opEvaluateParallelLazy(SliceOps.java:150)
	at
java.util.stream.AbstractPipeline.sourceSpliterator(AbstractPipeline.java:442)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:230)
	at java.util.stream.LongPipeline.reduce(LongPipeline.java:447)
	at java.util.stream.LongPipeline.sum(LongPipeline.java:405)
	at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)
	at OOM.firstNPrimes(OOM.java:24)
	at OOM.main(OOM.java:11)


-Aleksey.


More information about the lambda-dev mailing list