我正在查看CodeHeap
的初始化,并被“承诺的存储区”和ReservedSpace
的概念所迷惑。预订looks like的方法如下:
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
包含一个指针,该指针的空间为{{1} }之前。
我不明白的是,在调用!heap->reserve(rs, size_initial, CodeCacheSegmentSize)
时,我们是在mmap
拥有指针的已经保留的内存上执行的。
我在gdb上运行rs
,并注意到代码缓存初始化java -XX:+UseG1GC -XX:ReservedCodeCacheSize=512m --version
调用_memory.initialize(rs, c_size)
,而commit_expanded(middle_high(), middle_needs, _middle_alignment, pre_touch, _executable)
依次用heap->reserve(rs, size_initial, CodeCacheSegmentSize)
调用。{p>
这是middle_needs = 2555904
是什么,为什么我们需要扩展?我认为代码空间所需的所有虚拟内存映射都是在middle_needs
构造函数中完成的