There's absolutely no reason why there needs to be a warm-up period. You can cache the JITted binary code to disk. CPUs really don't care how the code was produced.
A sampling profiler can be pretty cheap. Just record stack state every n milliseconds, no need to instrument everything.
Actual JITting can be done on those other cores that would otherwise be idle anyways.