Выделение памяти при инициализации VirtualSpace - PullRequest
0 голосов
/ 28 июня 2019

Я смотрю на 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 конструкторе

...