如上的核心实现,是通过 VirtualMachine
进行远程连接。
然后构建 JDK 源码通过 OpenJDK with CLion 懒人包 ,debug
依次
javaVFrame::print_locked_object_class_name vframe.cpp:156
6
javaVFrame::print_lock_info_on vframe.cpp:251
JavaThread::print_stack_on thread.cpp:3259
Threads::print_on thread.cpp:4786
VM_PrintThreads::doit vmOperations.cpp:171
VM_Operation::evaluate vmOperations.cpp:68
VMThread::evaluate_operation vmThread.cpp:383
VMThread::loop vmThread.cpp:521
VMThread::run vmThread.cpp:274
Thread::call_run thread.cpp:393
thread_native_entry os_linux.cpp:791
start_thread 0x00007fa45e0defa3
clone 0x00007fa45e00a4cf
其中会创建 vframe.cpp#MonitorInfo
然后会获取监听器的 owner
最后通过 globalDefineitions.hpp#p2i
将 pointer
转化位 intptr_t
参见
"main" #1 prio=5 os_prio=31 tid=0x00007f9bd6808800 nid=0x1503 waiting on condition [0x000070000f70b000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Gzip3Test.main(Gzip3Test.java:22)
// 这里的值
- locked <0x000000071575ca20> (a java.lang.Object)
可以知道,最后打出来的值是锁的持有对象的地址。
通过 2023-08-2JOL 依赖类库 这个依赖库,也能获取到相对应的 10 进制值,然后转化成 16 进制即可发现一致。
比如
和之前的 Synchronized
预期一致