Как и где выделение динамической памяти интерпретируется внутри исходного кода 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.