Conditional breakpoints in IntelliJ were big for me when I discovered them. It's helpful when there's many iterations of the same function so you can stop at specific inputs.

There's a lot of options you can put on each breakpoint in IntelliJ, every developer should know about them. Right click on the breakpoint and click the "More" link.

Using "Run to cursor" is my favorite less known feature in debugging, it's really useful.

Don't forget about "Reset Frame". When you're manually stepping over something and accidentally go too far, this will take you back to the previous stack frame so you can try again.

A winning combination with control-shift-f9 to recompile the function body and then drop-frame to retry with the new code

I have lost hope for DCEVM being upstreamed to allow structural changes to the class :-(

Dcevm is regularly released from JetBrains as part of their JDK. https://github.com/JetBrains/JetBrainsRuntime

Also with 'Java on Truffle' on GraalVM you can use enhanced class reloading https://www.graalvm.org/latest/reference-manual/java-on-truf...

I think hot code reloading did not look that good in a very long time.