"When it feels like it". I don't mean to be frivolous, but there's no general answer.
A JVM can either interpret bytecode, or compile it to the native machine code. Machine code runs faster, but it costs time and space to compile it. There's therefore a tradeoff to be made, and there are no requirements to handle the tradeoff one way or another. Indeed, it can vary from one JVM to another, or one version to another.
The subject is called "Just In Time" compilation (JIT) and there will be different implementations. Consult your JVM documentation.
My guess is that a likely mechanism is to notice that the same method has been executed "some number of times" and would therefore benefit from being compiled to machine code. i.e, your #3 answer is probably closest.