Как codesection использует информацию о перемещении скомпилированного кода jvm в hotspot?

#jvm-hotspot

Вопрос:

Я знаю, что скомпилированный код хранится в буфере кода в hotspot и состоит из трех разделов: insts , consts , stubs , в каждом разделе есть relocs , и мне интересно, как hotspot использует эту информацию о перемещении?

Ответ №1:

Вы можете найти исчерпывающее описание перемещений точек доступа в файле relocInfo.hpp.

Короче говоря, они необходимы для обновления значений, встроенных в скомпилированный код, когда это необходимо, в частности:

  • чтобы обновлять ссылки на объекты всякий раз, когда GC перемещает объекты;
  • для обновления различных адресов и смещений при каждом перемещении скомпилированного кода (во время уплотнения кучи кода).

Вот типы перемещений в JDK 17:

 enum relocType {
  none                    =  0, // Used when no relocation should be generated
  oop_type                =  1, // embedded oop
  virtual_call_type       =  2, // a standard inline cache call for a virtual send
  opt_virtual_call_type   =  3, // a virtual call that has been statically bound (i.e., no IC cache)
  static_call_type        =  4, // a static send
  static_stub_type        =  5, // stub-entry for static send  (takes care of interpreter case)
  runtime_call_type       =  6, // call to fixed external routine
  external_word_type      =  7, // reference to fixed external address
  internal_word_type      =  8, // reference within the current code blob
  section_word_type       =  9, // internal, but a cross-section reference
  poll_type               = 10, // polling instruction for safepoints
  poll_return_type        = 11, // polling instruction for safepoints at return
  metadata_type           = 12, // metadata that used to be oops
  trampoline_stub_type    = 13, // stub-entry for trampoline
  runtime_call_w_cp_type  = 14, // Runtime call which may load its target from the constant pool
  data_prefix_tag         = 15, // tag for a prefix (carries data arguments)
  type_mask               = 15  // A mask which selects only the above values
};
 

Комментарии:

1. Спасибо за ваш ответ, я заметил, что на этапе code_emit статический вызов создаст статическую заглушку, и, выполнив некоторое перемещение здесь , вы можете найти логику в функции emit_call из файла /src/hotspot/share/c1/c1_LIRAssembler.cpp , я не понимаю, зачем нужно создавать заглушку? какая-нибудь помощь?

2. @Николас, Это другая тема, не связанная с вашим первоначальным вопросом. Вы можете задать отдельный вопрос по этому поводу.

3. большое вам спасибо, и я это сделал.