所有的初始化工作都在JNI_CreateJavaVM(JavaVM **p_jvm, void **p_env, void *args)函数中进行,该函数调用CVMinitVMGlobalState(),initializeSystemClasses()等众多初始化函数。
CVMpreloaderInit()
CVM支持class ROMization(在编译的时候),
在CVM中,method的数据结构(CVMMethdBlock)由不可变和可变部分组成。不可变部分包括方面和type ID,方法表索引(methodtable index)等。一旦被JCC(ROMizer)或classloader初始化后,这些域将绝不会被修改。可变部分包括调用者(invoker pointer)指针,编译后代码的起始PC(compiled co
可能在CVMinitVMGlobalState()函数进行初始化
CVM有用遍及整个VM子系统的控制铜鼓的全局mutexes。这包括jit lock, heap lock, thread-list lock, class table lock, loader cache lock, global roots lock, weak global roots lock, typeid lock等。在自举工程当中,CVM创建并初始化这些全局locks。
调用CVMinitGCRootStack()函数对各个stack进行初始化。初始化GC root stacks包括global roots stack (for allocating JNI global references and CVM global roots), weak global roots stack (for allocating JNI weak global references), class global roots stack, classloader global roots stack, protection domain global roots stack, and class table root stack(for all dynamically loaded classes). The global root stacks are used by GC for scanning live objects.
CVMinitVMGlobalState() -> CVMtypeidInit()
VM做的下一件事情就是初始化typeid system并注册一些常用typeids,例如: CVMglobals中的<init>, <clinit>,
CVMinitVMGlobalState() ->
CVMglobals.loaderCache = (CVMLoaderCacheEntry **)
the class loader cache
注意:
例如:
当一个新的类将被添加到cache当中的时候,必须确保它不会破坏任何已经存在的约束(constraints)。
在执行过程当中,作为class连接的结果,可能会增加新的约束。在增加每一个新的约束前,必须确保cache中缓存的classes将满足新的约束。
CVM使用-Xms, -Xmn
CVMinitVMGlobalState ->
初始化Monitor: CVMBool CVMeeSyncInitGlobal(CVMExecEnv *ee, CVMGlobalState *gs)
初始化异常对象: CVMinitVMGlobalState -> CVMID_allocNewInstance(ee, CVMsystemClass(java_lang_OutOfMemoryError),
VM创建一定初始数目的object monitors。这是虚拟机所知的、它所需要的最小数目。desperation exception objects包括OutOfMemoryError, StackOverflowError等。
如果支持debugger
如果支持运行时编译(JIT),那么虚拟机需要执行JIT相关的初始化,包括初始化编译策略,后端编译器,代码缓存区等。
JNI_CreateJavaVM
CVM_LVM
被ROMized的系统类需要明确地被VM进行初始化。首先,它首先通过执行它们的静态初始化块(static initializers)
然后它创建System ThreadGroup, main ThreadGroup, and main Thread objects.在线程对象初始化后,VM调用System.initializeSystemClass()来设置system properties, stdin, stdout, and stderr。在此期间,它也创建:
A Reference handler thread, which enqueues pending References
A Finalizer thread that runs the finalizer.
//
static CVMBool CVMLVMinitSystemClasses(JNIEnv* env, jobject initThread)
{
systemClass = CVMcbJavaInstance(CVMsystemClass(java_lang_System));
虚拟机调用sun.misc.CVM.parseCommandLineOptions()来解析剩余的参数,在此过程当中,它增加用户定义的属性,并寻找main函数所在的类名。
现在CVM准备执行main方法,
联系客服