Как и где выделение динамической памяти интерпретируется внутри исходного кода OpenJDK?

Я пытаюсь изменить исходный код OpenJDK для моего исследовательского проекта. Я хочу знать поток кода, когда я вызываю новый оператор внутри Java-программы.

class MyFirstProgram {
    public static void main(String args[]) throws Exception{
        System.out.println("Hello World!");
        int i[] = new int[50];
    }
}

В исходном коде OpenJDK я поместил несколько отпечатков в новую реализацию оператора. (Путь: OpenJDKDev / src / hotspot / share / memory / alloc.cpp)

Я не уверен, проверяю ли я правильный файл для выделения памяти. Кажется, что даже когда я вызываю java -version, он печатает сообщения, которые я помещал много раз.

Я не могу определить, как именно (и где именно) выполняются вызовы выделения памяти, когда я вызываю новый внутри пользовательской Java-программы.

Редактировать: -> Использование JDK11.

1 ответ

У меня для вас плохие новости. В источниках HotSpot нет единого места, которое обрабатывало бы все распределения Java.

Распределение может произойти:

  • Во время выполнения виртуальной машины;
  • В интерпретаторе байт-кода;
  • В JIT-скомпилированном коде:
    • составлено C1;
    • составлено С2;
    • составлено Граалом и т. д.

Подход в каждом случае совершенно разный. Например, самая простая часть - это среда выполнения виртуальной машины - это просто простой код C++, который легко изменить, см. MemAllocator::mem_allocate,

Чтобы изменить интерпретатор, вам нужно разобраться с кодом ассемблера, см. TemplateTable::_new,

Распределение C1 также написано в ASM. Не забывайте, что существует несколько путей выделения: в TLAB, в Eden или в распределении по медленному пути, которое возвращается к времени выполнения виртуальной машины.

Умножьте весь код сборки на количество архитектур: x86, ARM, AArch64, PPC и т. Д.

C2 - еще одна проблема, поскольку она требует создания некоторых потрясающих ИК-графиков. Кстати, графики для размещения экземпляров классов и массивов разные. Если вы все еще хотите поиграть с ним, взгляните на GraphKit::new_instance и GraphKit:: new_array.

Я не имею в виду, что "немного изменить стратегию распределения" абсолютно невозможно, но я бы сказал, что это огромный объем работы, требующий глубокого знания JVM.

PS src / hotspot / share / memory / alloc.cpp не имеет ничего общего с Java Heap. Эта часть отвечает за собственное распределение "C" для внутренних целей JVM.

Другие вопросы по тегам