Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Monitoring lock contention on Java applications

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?

like image 216
agori Avatar asked Dec 15 '25 01:12

agori


1 Answers

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.
like image 59
apangin Avatar answered Dec 16 '25 20:12

apangin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!