Understanding JVM Internals And Java Bytecode To Write Better Code