Technically JIT may run along with the execution, profile and later replace the code, i.e. start on interpreter, run a bit, compile. JITting is far more complex than "running before the code is needed", technically it can even deoptimize some code and then optimize it better.