启动流程
当执行java命令时,程序会去寻找合适的JRE的home位置。
在JRE/lib/cpu_arch(cpu的架构)/JVM.cfg下找到这个文件。
在JVM.cfg中存在以下的配置信息:
-client KNOWN (客户端模式)
-server KNOWN(服务端模式)
-hotspot ALIASED_TO -client(等同于client模式)
-classic WARN(已经推出历史舞台,还有限度支持,将有可能又其它JVM的设置来替代)
-native ERROR(不支持,报错)
-green ERROR (不支持,报错)
通过文件我们可以定义目前jdk中支持那些JVM,前面部分(client)是JVM名称,后面是参数。
KNOWN表示JVM存在,
ALIASED_TO表示给别的JVM取一个别名,
WARN表示不存在时找一个JVM替代,
ERROR表示不存在抛出异常。
如果在运行Java时未指定上面两种方法中的任一一种参数,那么会返回第一个定义的jvm。所以可以通过这个文件调整默认jvm类型。
确定jvm类型后就可以基于LoadLibrary来加载dll文件,完成JVM的创建准备工作。
装载完JVM环境之后,需要对启动参数进行解析。
加载jvm.dll后就可以使用里面的函数,调用InvocationFunctions->CreateJavaVM
也就是JVM中JNI_CreateJavaVM方法获得JNIEnv结构的实例
JVM初始化结束之后,在启动通过findClass等操作加载Main入口类,调用main方法执行Java程序的后续操作
JVM类型
jvm常用两种类型client、server关于两种类型jvm的区别,官方给出的解释:
这两个系统是不同的二进制文件。 它们基本上是两个不同的编译器(JIT),它们连接到同一个运行时系统。 客户端系统对于需要快速启动时间或占用空间较小的应用程序是最佳的,服务器系统对于总体性能最重要的应用程序是最佳的。 通常,客户端系统更适合于诸如GUI的交互式应用。 一些其他差异包括编译策略,堆默认值和内联策略。
可以根据不同的场景选择不同的jvm 未完
原文:http://a4boy.blog.51cto.com/7938796/1888685