3

I am trying to create a little benchmark (in Groovy) that shows high thread contention on a couple of synchronized methods. High contention should show up when monitoring voluntary context switches, and in Linux this can be achieved thanks to "pidstat".

The program is the following:

class Res {

    private int n;

    synchronized public void inc() {
        n++;
        def foo = []
        for (int i = 0; i < 1000; ++i) foo << "hello"
    }

    synchronized public int getN() {
        return n;
    }

}




while (true) {

    Res res = new Res()

    int N = 100000

    for (int i = 0; i < N; ++i) {
        new Thread({ 
            res.inc() 
            if (res.getN() == N) {
                println "ok" 
            }
        }).start()
    }

    while (res.getN() < N) {

    }


    println "========================="

}

but the command

pidstat -w -I -p 26848 5

is printing 0 on the voluntary context switches column. The program creates 100000 thread that concurrently access a synchronized method. I can't believe that with such workload, no context switching is happening.

What's wrong with my benchmark?

agori
  • 481
  • 6
  • 14
  • You can try the new [Oracle Mission Control](http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html). If you hook your application into the [flight recorder](http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/) you should get data on lock contention. – Boris the Spider Mar 30 '14 at 20:56

1 Answers1

6

Your command displays statistics for the main thread only, child PIDs are not counted.

Hotspot JVM has internal synchronization counters, but some magic is needed in order to unlock them:

  1. Run jconsole.exe -J-Djconsole.showUnsupported and connect to your JVM.
  2. Select Connection -> Hotspot MBeans -> Create from the main menu.
  3. Open sun.management.HotspotRuntime on the MBeans tab.
  4. You'll find a bunch of counters under InternalRuntimeCounters attribute:
    • sun.rt._sync_ContendedLockAttempts
    • sun.rt._sync_Parks
    • sun.rt._sync_Notifications
    • sun.rt._sync_Inflations
      etc.
apangin
  • 92,924
  • 10
  • 193
  • 247
  • 4
    Thanks, anyway I've found that pidstat -w -I -t -p 26848 5 (I added -t) shows informations relative to the single thread. – agori Apr 01 '14 at 13:16