您好,欢迎来到赋能网!

Java之JVM的相关介绍

赋能网 2023-05-10 86

    JVM的中文名称叫java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机。JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候JVM的作用就体现出来了,它负责把我们的程序翻译给系统“听”,告诉它我们的程序需要做什么操作。我们都知道Java的程序需要经过编译后,产生.Class文件,JVM才能识别并运行它,JVM针对每个操作系统开发其对应的解释器,所以只要其操作系统有对应版本的JVM,那么这份Java编译后的代码就能够运行起来,这就是Java能一次编译,到处运行的原因。

一、JVM的生命周期

    JVM在Java程序开始执行的时候,它才运行,程序结束的时它就停止。一个Java程序会开启一个JVM进程,如果一台机器上运行三个程序,那么就会有三个运行中的JVM进程。JVM中的线程分为两种:守护线程和普通线程守护线程是JVM自己使用的线程,比如垃圾回收(GC)就是一个守护线程。普通线程一般是Java程序的线程,只要JVM中有普通线程在执行,那么JVM就不会停止。权限足够的话,可以调用exit()方法终止程序。

二、JVM的启动过程

1、JVM的装入环境和配置

    在学习这个之前,我们需要了解一件事情,就是JDK和JRE的区别。JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境,JDK中包含了JRE。JRE是Java的运行环境,是面向所有Java程序的使用者,包括开发者。JRE = 运行环境 = JVM。如果安装了JDK,会发现电脑中有两套JRE,一套位于/Java/jre.../下,一套位于/Java/jdk.../jre下。那么问题来了,一台机器上有两套以上JRE,谁来决定运行那一套呢?这个任务就落到java.exe身上,java.exe的任务就是找到合适的JRE来运行java程序。

java.exe按照以下的顺序来选择JRE:

    自己目录下有没有JRE

    父目录下有没有JRE

    查询注册表: 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 表示不存在抛出异常
2、装载JVM

    通过第一步找到JVM的路径后,Java.exe通过LoadJavaVM来装入JVM文件。
LoadLibrary装载JVM动态连接库,然后把JVM中的到处函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMIntArgs 挂接到InvocationFunction 变量的CreateJavaVM和GetDafaultJavaVMInitArgs 函数指针变量上。JVM的装载工作完成。
3、初始化JVM,获得本地调用接口

    调用InvocationFunction -> CreateJavaVM也就是JVM中JNI_CreateJavaVM方法获得JNIEnv结构的实例。
4、运行Java程序

    JVM运行Java程序的方式有两种:jar包 与 Class
    运行jar 的时候,Java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用JarFileJNIEnv类中getManifest(),从其返回的Manifest对象中取getAttrebutes("Main-Class")的值,即jar 包中文件:meta-INF/MANIFEST.MF指定的的Main-Class的主类名作为运行的主类。之后main函数会调用Java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。
    运行Class的时候,main函数直接调用Java.c中的LoadClass方法装载该类。

5、Class文件

    Class文件由Java编译器生成,我们创建的.Java文件在经过编译器后,会变成.Class的文件,这样才能被JVM所识别并运行。

6、类加载子系统

类加载子系统也可以称之为类加载器,JVM默认提供三个类加载器:

    BootStrap ClassLoader :称之为启动类加载器,是最顶层的类加载器,负责加载JDK中的核心类库,如 rt.jar、resources.jar、charsets.jar等。

    Extension ClassLoader:称之为扩展类加载器,负责加载Java的扩展类库,默认加载$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目录下的jar包。

    App ClassLoader:称之为系统类加载器,负责加载应用程序classpath目录下所有jar和class文件。

    除了Java默认提供的三个ClassLoader(加载器)之外,我们还可以根据自身需要自定义ClassLoader,自定义ClassLoader必须继承java.lang.ClassLoader 类。除了BootStrap ClassLoader 之外的另外两个默认加载器都是继承自java.lang.ClassLoader 。BootStrap ClassLoader 不是一个普通的Java类,它底层由C++编写,已嵌入到了JVM的内核当中,当JVM启动后,BootStrap ClassLoader 也随之启动,负责加载完核心类库后,并构造Extension ClassLoader 和App ClassLoader 类加载器。

  想了解更多相关资讯请关注java培训频道-查看更多,了解相关专业课程信息您可在线咨询也可免费申请试课。关注赋能网了解更多:4008-569-579

本文链接:

本文章“Java之JVM的相关介绍”已帮助 86 人

免责声明:本信息由用户发布,本站不承担本信息引起的任何交易及知识产权侵权的法律责任!

本文由赋能网 整理发布。了解更多培训机构》培训课程》学习资讯》课程优惠》课程开班》学校地址等机构信息,可以留下您的联系方式,让课程老师跟你详细解答:
咨询热线:4008-569-579

如果本页不是您要找的课程,您也可以百度查找一下: