Я смотрю на CodeHeap
инициализацию и был сбит с толку концепцией "области памяти с фиксацией" и ReservedSpace
.Вот как выглядит резервирование :
ReservedCodeSpace rs = reserve_heap_memory(cache_size);
ReservedSpace non_method_space = rs.first_part(non_nmethod_size);
ReservedSpace rest = rs.last_part(non_nmethod_size);
ReservedSpace profiled_space = rest.first_part(profiled_size);
ReservedSpace non_profiled_space = rest.last_part(profiled_size);
Резервирование памяти для кэша кода возвращается к base = os::reserve_memory(size, NULL, alignment, _fd_for_heap);
, который в свою очередь вызывает mmap
для выполненияотображение виртуальной памяти, которое мы передаем ReservedCodeSpace rs
, содержащее указатель на пространство, которое mmap
редактировалось ранее.
То, что я не понимаю, - это когда мы вызываем !heap->reserve(rs, size_initial, CodeCacheSegmentSize)
, который мы делаемпоэтому в уже зарезервированной памяти, на которую rs
содержит указатель.
Я запустил java -XX:+UseG1GC -XX:ReservedCodeCacheSize=512m --version
с GDB и заметил, что инициализация кэша кода heap->reserve(rs, size_initial, CodeCacheSegmentSize)
вызывает _memory.initialize(rs, c_size)
, который в свою очередь вызывает commit_expanded(middle_high(), middle_needs, _middle_alignment, pre_touch, _executable)
с middle_needs = 2555904
.
Что это за middle_needs
и зачем нам расширение?Я думал, что все сопоставление виртуальной памяти, необходимое для кодового пространства, сделано в ReservedCodeSpace
конструкторе