Where does the HotSpot JVM store interpreted bytecode?

I’ve been wondering where interpreted byte-code of methods are stored internally in the JVM (specifically HotSpot x64). I know that methods that are JIT-ed are stored and can be accessed in the Method structure but I’m trying to understand where the JVM stores the byte-code converted to assembly instructions (I assume it stores them, otherwise there would be a lot of memory usage to interpret every invocation) as I wasn’t able to find it in the internals source code.

Answer

Interpreting bytecode is not as expensive as you would think. Why would the JVM spend time generating machine code for code that runs once? Best to wait until a certain method or block reaches the JIT threshold and only then spend time enabling the tracing JIT.

The src/share/vm/interpreter subdirectory seems to be what you’re after:

  • bytecodeInterpreter.cpp implements the actual stack machine;
  • bytecodes.cpp defines the shape and attributes of each opcode.
  • bytecodes.h declares all bytecodes.
  • templateTable.cpp contains machinery to map JVM opcodes to assembly.
  • cpu/*/vm/templateTable*.cpp contains the actual code to generate assembly snippets for the given CPU.

Leave a Reply

Your email address will not be published. Required fields are marked *