美文网首页
关于jdk安装后的包目录详解和jvm启动《简单了解》

关于jdk安装后的包目录详解和jvm启动《简单了解》

作者: 极客123 | 来源:发表于2018-10-25 15:33 被阅读0次

    一 、关于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的主类名作为运行的主类。
    
    之后会调用Java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。
    然后调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中“public static void main(String[] args)”方法,并判断该方法是否为public方法,然后调用JNIEnv实例的CallStaticVoidMethod方法调用该Java类的main方法。

    相关文章

      网友评论

          本文标题:关于jdk安装后的包目录详解和jvm启动《简单了解》

          本文链接:https://www.haomeiwen.com/subject/aktctqtx.html