一 、关于jdk目录
1 COPYRIGHT和LICENSE为版权和签证的说明性文档
2 bin/ JDK的各种工具命令即JDK开发工具的可执行文件其中这些可执行文件都是二进制的,其中包括编译器、解释器以及其他一些工具,比如我们刚开始用的Javac、Java命令去检查JDK是否安装配置正确就是在这个目录下面的命令。
3 jre 运行时环境
4 lib/ JDK工具命令的实际执行程序
5 include/ 目录里面是一些供C语言使用的标题文件,其中C语言的头文件支持Java本地接口和Java虚拟机调试程序接口的本地编程技术。C语言和C++语言的头文件, 文件后缀为 .h 该文件中一般只放入函数声明,宏定义,函数原型,具体实现放在 .c (c语言) 或者 .cpp (c++ 语言 ) 文件中
二 、关于JVM启动流程
JVM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间.
JVM体系主要是两个JVM的内部体系结构分为三个子系统和两大组件,分别是:类装载器(ClassLoader)子系统、执行引擎子系统和GC子系统,组件是内存运行数据区域和本地接口。
JVM工作原理和特点主要是指
操作系统装入JVM是通过jdk中Java.exe来完成
通过下面4步来完成JVM环境.
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
如果安装了JDK,会发现电脑中有两套JRE,一套位于/Java/jre.../下,一套位于/Java/jdk.../jre下。那么问题来了,一台机器上有两套以上JRE,谁来决定运行那一套呢?这个任务就落到java.exe身上,java.exe的任务就是找到合适的JRE来运行java程序。
java.exe按照以下的顺序来选择JRE:
1、自己目录下有没有JRE
2、父目录下有没有JRE
3、查询注册表:HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment"当前JRE版本号"\JavaHome这几步的主要核心是为了找到JVM的绝对路径。
jvm.cfg的路径为:JRE路径\lib"CPU架构"\jvm.fig
jvm.cfg的内容大致如下:
-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR :本地函数库不存在抛出异常
-green ERROR
KNOWN 表示存在 、IGNORE 表示不存在 、ALIASED_TO 表示给别的JVM取一个别名
WARN 表示不存在时找一个替代 、ERROR 表示不存在抛出异常
配置Ending
通过第一步找到JVM的路径后,Java.exe通过LoadJavaVM来装入JVM文件。
通过第一步已经找到了JVM的路径,Java通过LoadJavaVM来装入JVM.dll文件.装入工作很简单就是调用Windows API函数:
LoadLibrary 装载 JVM.dll 动态连接库.然后把JVM.dll中的导出函数JNI_CreateJavaVM 和 JNI_GetDefaultJavaVMInitArgs 挂接到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上。
JVM.dll的装载工作宣告完成。
三:初始化JVM,获得本地调用接口,这样就可以在Java中调用JVM的函数了.调用InvocationFunctions->CreateJavaVM也就是JVM中JNI_CreateJavaVM方法获得JNIEnv结构的实例.
四:运行Java程序.
Java程序有两种方式一种是jar包,一种是.class:
运行jar,Java -jar XXX.jar运行的时候
Java.exe 调用 GetMainClassName函数,该函数先获得JNIEnv实例
然后调用Java类Java.util.jar.JarFileJNIEnv中方法
getManifest() 调用后并从返回的Manifest对象中
取getAttributes("Main-Class")的值即jar包中文件:
META-INF/MANIFEST.MF 指定的Main-Class的主类名作为运行的主类。