#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. большое вам спасибо, и я это сделал.