[concurrency-interest] Some fork/join threads idle when workload is non-uniform

Peter De Maeyer peter at de.maeyer.net
Sat May 26 04:55:54 EDT 2012


We have a multithreaded application which relies heavily on the F/J 
framework. When threadprofiling the application we've observed that not 
all F/J threads are kept busy. Some threads spend a lot of time waiting, 
thus making suboptimal use of the available CPUs in the system.

I've discovered it may have something to do with the workload 
distribution. The tasks are being spawned according to a quad-tree 
structure. When each branch in the quad tree has roughly the same amount 
of work to do, all F/J threads are nicely occupied (uniform workload). 
When some branches however have a lot more work to do, while others 
don't, some F/J threads are waiting (non-uniform workload).

I am guessing it has something to do with a suboptimality in work 
stealing: in the case of uniform workload, there is little to no work 
stealing going on, and everything behaves nicely. In the case of 
non-uniform workload, there is (a lot?) more work stealing going on, 
which somehow results in waiting F/J threads.

I have attached the following files to illustrate my case:

  * ForkJoinWithUniformWorkload.java: illustrates the 'well-behaved'
    case where all F/J threads are busy (optimal usage of multi-core CPU)
  * ForkJoinWithNonUniformWorkload.java: illustrates the 'ill-behaved'
    case where one F/J thread is waiting all the time (suboptimal usage
    of multi-core CPU)
  * ForkJoinWithUniformWorkload.png: JVisualVM snapshot (screenshot) of
    the ForkJoinWithUniformWorkload program, where you can see all 4
    threads occupied
  * ForkJoinWithNonUniformWorkload.png: JVisualVM snapshot (screenshot)
    of the ForkJoinWithNonUniformWorkload program, where you can see 1
    thread sleeping. This is similar to what we see in our real-life
    application, although in our real-life application we've observed 3
    out of 8 threads waiting while only 5 are doing actual work. Note
    that this behavior is not 100% reproducible, but often enough to be
    investigated thoroughly
  * threaddump-*.tdump: thread dump of the case where the thread
    "ForkJoinPool-1-worker-1"
    of the 4 F/J threads is waiting (tryAwaitDone).

I would like to:

 1. Understand why the application is behaving this way
 2. Find a solution so that our application makes optimal use of all
    available CPUs in all circumstances


Best regards,

Peter De Maeyer

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20120526/912d8099/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ForkJoinWithNonUniformWorkload.png
Type: image/png
Size: 96698 bytes
Desc: not available
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20120526/912d8099/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ForkJoinWithUniformWorkload.png
Type: image/png
Size: 92946 bytes
Desc: not available
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20120526/912d8099/attachment-0003.png>
-------------- next part --------------
2011-12-08 07:50:56
Full thread dump Java HotSpot(TM) Server VM (21.1-b02 mixed mode):

"RMI TCP Connection(2)-127.0.0.1" daemon prio=10 tid=0x08d93400 nid=0x4ea6 runnable [0x6ed5c000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
	- locked <0xa1965628> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:83)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- <0xa157d068> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"JMX server connection timeout 17" daemon prio=10 tid=0x08d60000 nid=0x4ea4 in Object.wait() [0x6edad000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0xa16fa210> (a [I)
	at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168)
	- locked <0xa16fa210> (a [I)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- None

"RMI Scheduler(0)" daemon prio=10 tid=0x08d5ac00 nid=0x4ea2 waiting on condition [0x6edfe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0xa151e960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- None

"RMI TCP Connection(1)-127.0.0.1" daemon prio=10 tid=0x08a70800 nid=0x4ea1 runnable [0x6f156000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:150)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
	- locked <0xa169ce90> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:83)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- <0xa157cc28> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"RMI TCP Accept-0" daemon prio=10 tid=0x08cdc000 nid=0x4e9e runnable [0x6f1a7000]
   java.lang.Thread.State: RUNNABLE
	at java.net.PlainSocketImpl.socketAccept(Native Method)
	at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:396)
	at java.net.ServerSocket.implAccept(ServerSocket.java:522)
	at java.net.ServerSocket.accept(ServerSocket.java:490)
	at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52)
	at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
	at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:359)
	at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
	- None

"Attach Listener" daemon prio=10 tid=0x092c3800 nid=0x4e9c waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"ForkJoinPool-1-worker-4" daemon prio=10 tid=0x08a7b400 nid=0x4e11 runnable [0x6f6b9000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.StrictMath.atan(Native Method)
	at java.lang.Math.atan(Math.java:204)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.doSomething(ForkJoinWithNonUniformWorkLoad.java:67)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:59)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:52)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:52)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:53)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:334)
	at java.util.concurrent.ForkJoinWorkerThread.helpJoinTask(ForkJoinWorkerThread.java:812)
	at java.util.concurrent.ForkJoinWorkerThread.joinTask(ForkJoinWorkerThread.java:727)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:362)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:53)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:334)
	at java.util.concurrent.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:604)
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:762)
	at java.util.concurrent.ForkJoinPool.work(ForkJoinPool.java:646)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:398)

   Locked ownable synchronizers:
	- None

"ForkJoinPool-1-worker-3" daemon prio=10 tid=0x08a79c00 nid=0x4e10 runnable [0x6f70a000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.StrictMath.atan(Native Method)
	at java.lang.Math.atan(Math.java:204)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.doSomething(ForkJoinWithNonUniformWorkLoad.java:67)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:59)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:52)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:52)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:53)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:334)
	at java.util.concurrent.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:604)
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:762)
	at java.util.concurrent.ForkJoinPool.work(ForkJoinPool.java:646)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:398)

   Locked ownable synchronizers:
	- None

"ForkJoinPool-1-worker-2" daemon prio=10 tid=0x08a78000 nid=0x4e0f runnable [0x6f75b000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.StrictMath.atan(Native Method)
	at java.lang.Math.atan(Math.java:204)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.doSomething(ForkJoinWithNonUniformWorkLoad.java:67)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:59)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:53)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:52)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:53)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:355)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:51)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:334)
	at java.util.concurrent.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:604)
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:762)
	at java.util.concurrent.ForkJoinPool.work(ForkJoinPool.java:646)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:398)

   Locked ownable synchronizers:
	- None

"ForkJoinPool-1-worker-1" daemon prio=10 tid=0x6ff40800 nid=0x4e0e in Object.wait() [0x6f7ac000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x747d4188> (a ForkJoinWithNonUniformWorkLoad$NonUniformWorkload)
	at java.util.concurrent.ForkJoinTask.tryAwaitDone(ForkJoinTask.java:264)
	- locked <0x747d4188> (a ForkJoinWithNonUniformWorkLoad$NonUniformWorkload)
	at java.util.concurrent.ForkJoinPool.tryAwaitJoin(ForkJoinPool.java:1043)
	at java.util.concurrent.ForkJoinWorkerThread.joinTask(ForkJoinWorkerThread.java:731)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:362)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at ForkJoinWithNonUniformWorkLoad$NonUniformWorkload.compute(ForkJoinWithNonUniformWorkLoad.java:52)
	at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:334)
	at java.util.concurrent.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:604)
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:784)
	at java.util.concurrent.ForkJoinPool.work(ForkJoinPool.java:646)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:398)

   Locked ownable synchronizers:
	- None

"Service Thread" daemon prio=10 tid=0x6ff04800 nid=0x4e0c runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"C2 CompilerThread1" daemon prio=10 tid=0x6ff02800 nid=0x4e0b waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"C2 CompilerThread0" daemon prio=10 tid=0x6ff00800 nid=0x4e0a waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Signal Dispatcher" daemon prio=10 tid=0x089bbc00 nid=0x4e09 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Finalizer" daemon prio=10 tid=0x08982c00 nid=0x4e07 in Object.wait() [0x6fc22000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x747d2c50> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
	- locked <0x747d2c50> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

   Locked ownable synchronizers:
	- None

"Reference Handler" daemon prio=10 tid=0x0897dc00 nid=0x4e06 in Object.wait() [0x6fc73000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x747d0500> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:503)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
	- locked <0x747d0500> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
	- None

"main" prio=10 tid=0x0886a000 nid=0x4dfc in Object.wait() [0xb697b000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x747d4160> (a ForkJoinWithNonUniformWorkLoad$NonUniformWorkload)
	at java.lang.Object.wait(Object.java:503)
	at java.util.concurrent.ForkJoinTask.externalAwaitDone(ForkJoinTask.java:287)
	- locked <0x747d4160> (a ForkJoinWithNonUniformWorkLoad$NonUniformWorkload)
	at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:365)
	at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:639)
	at java.util.concurrent.ForkJoinPool.invoke(ForkJoinPool.java:1521)
	at ForkJoinWithNonUniformWorkLoad.main(ForkJoinWithNonUniformWorkLoad.java:16)

   Locked ownable synchronizers:
	- None

"VM Thread" prio=10 tid=0x08978000 nid=0x4e05 runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x08871400 nid=0x4dfd runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x08872c00 nid=0x4dfe runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x08874000 nid=0x4dff runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x08875800 nid=0x4e00 runnable 

"GC task thread#4 (ParallelGC)" prio=10 tid=0x08877000 nid=0x4e01 runnable 

"GC task thread#5 (ParallelGC)" prio=10 tid=0x08878400 nid=0x4e02 runnable 

"GC task thread#6 (ParallelGC)" prio=10 tid=0x08879c00 nid=0x4e03 runnable 

"GC task thread#7 (ParallelGC)" prio=10 tid=0x0887b400 nid=0x4e04 runnable 

"VM Periodic Task Thread" prio=10 tid=0x6ff0ec00 nid=0x4e0d waiting on condition 

JNI global references: 198

-------------- next part --------------
A non-text attachment was scrubbed...
Name: ForkJoinWithUniformWorkLoad.java
Type: text/x-java
Size: 1788 bytes
Desc: not available
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20120526/912d8099/attachment-0002.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ForkJoinWithNonUniformWorkLoad.java
Type: text/x-java
Size: 2198 bytes
Desc: not available
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20120526/912d8099/attachment-0003.bin>


More information about the Concurrency-interest mailing list