It doesn&#x27;t make any sense to blame the garbage collector. During startup you&#x27;re loading classes, allocating structures, and verifying byte code. There aren&#x27;t things that involve garbage collection (allocating with a tracing GC is generally by bump-pointer so is very efficient).<p>I work on a large Java project (JRuby) and for us the largest component of time spent is on loading classes. Also, startup code is likely to run in the interpreter rather than being JIT compiled, which is also slower.<p>The solution we&#x27;re looking at is ahead of time compilation. This avoids class loading and interpretation, and it does seem to solve the problem (we&#x27;re back to ms startup time).<p>In V8 (Node.js) the majority of the core language and library features are effectively already AOT compiled as they&#x27;re implemented in C++. In the OpenJDK (and most JVMs) a lot of this is implemented in Java, so that has to be loaded and interpreted rather than executed natively.