做网站是干什么的,广告设计合同模板,wordpress后台cookies,平乡建设局网站第21章-引用处理器和JNI句柄初始化
21.1 引用处理器初始化
这一节主要是对软引用处理器使用前的各重要属性初始化#xff0c;为GC时对引用处理前的使用做准备#xff0c;使用细节会在GC专题中讲。函数的调用入口在init.cpp-referenceProcessor_init()
21.1.1 referenc…第21章-引用处理器和JNI句柄初始化
21.1 引用处理器初始化
这一节主要是对软引用处理器使用前的各重要属性初始化为GC时对引用处理前的使用做准备使用细节会在GC专题中讲。函数的调用入口在init.cpp-referenceProcessor_init()
21.1.1 referenceProcessor.cpp/hpp
21.1.1.1 referenceProcessor_init
void referenceProcessor_init() {ReferenceProcessor::init_statics();
}void ReferenceProcessor::init_statics() {// We need a monotonically non-deccreasing time in ms but// os::javaTimeMillis() does not guarantee monotonicity.// 这里需要一个毫秒级的单调不递减时间但是os::javaTimeNanos()是纳秒级的不支持所以这里要处理一下jlong now os::javaTimeNanos() / NANOSECS_PER_MILLISEC;// 初始化软引用的时间戳时钟_soft_ref_timestamp_clock now;// 同时更新 java_lang_ref_SoftReference 类中clock属性字段java_lang_ref_SoftReference::set_clock(_soft_ref_timestamp_clock);// 创建软引用清除策略_always_clear_soft_ref_policy new AlwaysClearPolicy();// 默认软引用标记策略 LRUMaxHeapPolicy LRUCurrentHeapPolicy 二选一GC专题中会细讲_default_soft_ref_policy new COMPILER2_PRESENT(LRUMaxHeapPolicy())NOT_COMPILER2(LRUCurrentHeapPolicy());if (_always_clear_soft_ref_policy NULL || _default_soft_ref_policy NULL) {vm_exit_during_initialization(Could not allocate reference policy object);}guarantee(RefDiscoveryPolicy ReferenceBasedDiscovery ||RefDiscoveryPolicy ReferentBasedDiscovery,Unrecongnized RefDiscoveryPolicy);// 这个值默认为 1表示用discovered字段来标记挂起的对象引用_pending_list_uses_discovered_field JDK_Version::current().pending_list_uses_discovered_field();
}21.2 JNI句柄初始化
函数入中init.cpp-jni_handles_init()。java应用调用c/c的函数是要通过jni来实现的所以在虚拟机中Java对象引用也都要用JNI句柄来持有。
21.2.1 jniHandles.cpp
21.2.1.1 jni_handles_init
void jni_handles_init() {JNIHandles::initialize();
}void JNIHandles::initialize() {// 这里都比较简单看下 JNIHandleBlock 类继承 CHeapObj就知道 allocate_block 分配内存块是在C堆中也就是说下面两行代码的意义就是分配了// 全局句柄块_global_handles JNIHandleBlock::allocate_block();// 弱引用句柄块_weak_global_handles JNIHandleBlock::allocate_block();EXCEPTION_MARK;// We will never reach the CATCH below since Exceptions::_throw will cause// the VM to exit if an exception is thrown during initializationKlass* k SystemDictionary::Object_klass();// 已删除的对象的句柄这块内存是在Java堆中分配的_deleted_handle InstanceKlass::cast(k)-allocate_instance(CATCH);
}