We've observed this guarantee once when a thread was about to exit:
# Internal Error (synchronizer.cpp:1677), pid=47037, tid=47409
# guarantee(l_om_in_use_count == in_use_count) failed: in-use counts don't match: l_om_in_use_count=2, in_use_count=1
Stack: [0x00003ffe13000000,0x00003ffe13200000], sp=0x00003ffe131fe180, free space=2040k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0xe5e450] ObjectSynchronizer::om_flush(Thread*)+0x710
V [libjvm.so+0xeb0cac] Threads::remove(JavaThread*, bool)+0x3c
V [libjvm.so+0xeb6840] JavaThread::exit(bool, JavaThread::ExitType)+0x830
V [libjvm.so+0xeb6aa0] JavaThread::post_run()+0x30
V [libjvm.so+0xeb3d88] Thread::call_run()+0x198
V [libjvm.so+0xcb11d4] thread_native_entry(Thread*)+0x154
C [libpthread.so.0+0x8a64] start_thread+0xf4
Hg tip: http://hg.openjdk.java.net/jdk/jdk/rev/755ab9edca97
Test: proprietary
Reproducer: not available at present
Platform: linuxppc64le (Power8)