So I have this method, written in Java:
public void myMethod(int y){
int x = 5 + y;
doSomething(x);
}
And assume my application cal
HotSpot JVM has a Method structure in Metaspace (or PermGen in earlier versions). It contains method bytecode which is never overwritten and a pointer to compiled code, initially NULL until the method is compiled.
A method may have multiple entry points:
_i2i_entry
- a pointer to the bytecode interpreter._code->entry_point()
- an entry point to the JIT-compiled code. Compiled methods reside in CodeCache
- the special region of native memory for the VM dynamically generated code.i2c
and c2i
adapters to call the compiled code from interpreter and vice versa. These adapters are needed, because the interpreted methods and compiled methods have different calling convention (the way how arguments are passed, how frames are constructed etc.)A compiled method can have uncommon traps that fall back to interpreter in some rare cases. Furthermore, a Java method can be dynamically recompiled multiple times, so JVM cannot throw away the original bytecode. There is no sense to free it anyway, because the bytecode is usually much smaller than the compiled code.