how big is the overhead for this? and how much easier is working with virtual threads than Rust's async?
1. Low enough that you don't need to worry for most web backend code and 2. Anything is easier than that. *XYZ is not Send* amiright?
With Rust's async you have to worry about a different worker thread picking up the work after a context switch, which makes things complicated. Not so with Java.
In case of java there really is no compiler magic even, “just” runtime magic.