初始化VirtualSpace时提交内存

时间:2019-06-28 09:47:51

标签: java c++ jvm jvm-hotspot

我正在查看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构造函数中完成的

0 个答案:

没有答案