We need a guaranteed way to easily account for all held locks in the application, exactly what any threads that hold them are doing, and identify what code / threads are waiting on them. Whatever way this is done needs to be simple, built into the runtime, and produce output that can be easily shared for off-line analysis. Information for both intrinsic monitors as well as j.u.c locks (if enabled) is required.
This is currently possible for platform threads (via a normal thread dump), but not virtual threads. This represents a severe regression in serviceability for any user of virtual threads.
Adding the needed lock information to the implementation of Thread.dump_to_file should be sufficient (given that all threads are tracked).