Hotspot源码解析-第十六章-代码缓存空间初始化
2024-01-09 17:45:10
第十六章-代码缓存空间初始化
16.1 codeCache.cpp
16.1.1 codeCache_init
void codeCache_init() {
CodeCache::initialize();
}
void CodeCache::initialize() {
// 判断操作
assert(CodeCacheSegmentSize >= (uintx)CodeEntryAlignment, "CodeCacheSegmentSize must be large enough to align entry points");
#ifdef COMPILER2
assert(CodeCacheSegmentSize >= (uintx)OptoLoopAlignment, "CodeCacheSegmentSize must be large enough to align inner loops");
#endif
assert(CodeCacheSegmentSize >= sizeof(jdouble), "CodeCacheSegmentSize must be large enough to align constants");
/*
* 下面三步都是将各自大小调整到按页面大小四舍五入,CodeCache分段的好处:
* 1.提升运行时程序性能,特别是GC的性能,GC扫描根只需要遍历一个区域而不需要遍历所有区域
* 2.提升代码局部性
*/
CodeCacheExpansionSize = round_to(CodeCacheExpansionSize, os::vm_page_size());
InitialCodeCacheSize = round_to(InitialCodeCacheSize, os::vm_page_size());
ReservedCodeCacheSize = round_to(ReservedCodeCacheSize, os::vm_page_size());
// 按ReservedCodeCacheSize, InitialCodeCacheSize, CodeCacheSegmentSize三块空间创建一个C堆空间,并用CodeHeap对象持有
if (!_heap->reserve(ReservedCodeCacheSize, InitialCodeCacheSize, CodeCacheSegmentSize)) {
vm_exit_during_initialization("Could not reserve enough space for code cache");
}
// 将新创建的C堆空间的封装到code heap内存池CodeHeapPool中,然后通过MemoryManager内存管理器对象通过数组来管理这些池对象,最后再分别将CodeHeapPool池对象和MemoryManager内存管理对象,添加到GrowableArray可增长的数组对象中,总结就是,这里预创建了内存区域,并用句柄管理起来
MemoryService::add_code_heap_memory_pool(_heap);
// 这个里面实际上没做什么,忽略
icache_init();
// 将生成的CodeCache区域注册到操作系统中,使得当在动态生成的代码中发生异常时,会将异常信息发送到topLevelExceptionFilter(顶级异常过滤器)
os::register_code_area(_heap->low_boundary(), _heap->high_boundary());
}
16.2 VM版本初始化
16.2.1 vm_version.cpp
16.2.1.1 VM_Version_init
void VM_Version_init() {
VM_Version::initialize();
#ifndef PRODUCT
if (PrintMiscellaneous && Verbose) {
os::print_cpu_info(tty);
}
#endif
}
void VM_Version::initialize() {
ResourceMark rm;
// Making this stub must be FIRST use of assembler
// 创建BufferBlob对象,stub_size 默认是600
stub_blob = BufferBlob::create("get_cpu_info_stub", stub_size);
if (stub_blob == NULL) { // 创建失败,打印日志并退出vm
vm_exit_during_initialization("Unable to allocate get_cpu_info_stub");
}
CodeBuffer c(stub_blob); // 创建CodeBuffer
VM_Version_StubGenerator g(&c); // 创建VM_Version_StubGenerator
// 得到获取cpu信息的函数
get_cpu_info_stub = CAST_TO_FN_PTR(get_cpu_info_stub_t,
g.generate_get_cpu_info());
// 调用函数获取cpu特征信息,比如cpu支持的各种指令集
get_processor_features();
}
文章来源:https://blog.csdn.net/zhang527294844/article/details/135484941
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!