• JVM -- JVM、JDK、JRE(一)


    一、JDK(Java Development Kit;Java开发工具包)

    JDK(Java Development Kit)即 Java开发工具包,Java的核心

    JDK是提供给Java开发人员使用的,JDK是Java程序开发者用来来编译、调试Java程序用的开发工具包,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了,除了包含JRE以外还包含了开发Java程序所必须的命令工具。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等

    JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件

    JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为JRE

    二、JRE(Java Runtime Environment;Java运行时环境)

    JRE(Java Runtime Environment)即Java运行时环境

    HRE包括JVM和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

    如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户

    三、JVM(Java Virtual Machine;Java虚拟机)

    JVM(Java Virtual Machine)即Java虚拟机

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的

    Java虚拟机,它是整个Java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行

    .class文件由编译器编译程序得到的二进制文件(.class文件)。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行(具有跨平台性,一次编译,到处运行)

    .class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。

    只有JVM还不能构成.class文件的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而JRE包含lib类库

    JVM对于主流的操作系统都有相应的版本,目的就是将 统一的字节码 编译成对应操作系统识的二进制码,然后执行。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的(字节码),就可以在多种平台上不加修改地运行。从而实现

    Write once,Run Anywhere!

     从图中可以看到,有了JVM这个抽象层之后,Java就可以实现跨平台了。JVM只需要保证能够正确执行.class文件,就可以运行在诸如Linux、Windows、MacOS等平台上了

    1、虚拟机

    虚拟机(Virtual Machine)可以分为系统虚拟机和程序虚拟机:

    (1)系统虚拟机:完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台,如Visual Box;

    (2)程序虚拟机:专门为执行单个计算机程序而设计,其典型代表就是Java虚拟机(JVM),在Java虚拟机中执行的指令我们称为Java字节码指令

    常见三种虚拟机:Oracle HotSpot、BEA JRockit、IBM J9

    2、JVM特性

    (1)自动内存管理

    (2)自动垃圾回收机制(相比于C++)

    (3)跨语言的平台,多语言混合编程

    3、JVM类加载流程原理

    4、JVM生命周期 

    Java实例对应一个独立运行的Java程序(进程级别

    1、启动

    启动一个Java程序,一个JVM实例就产生。拥有public static void main(String[] args)函数的class可以作为JVM实例运行的起点。

    2、运行

    main()作为程序初始线程的起点,任何其他线程均可由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM使用,程序可以指定创建的线程为守护线程。

    3、消亡

    当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。

    JVM执行引擎实例则对应了属于用户运行程序线程它是线程级别的

    四、JDK、JRE、JVM关系图

    JDK1.8官网地址 

    https://docs.oracle.com/javase/8/docs/index.html

    JDK1.6官网地址

    Java SE 6 Documentation

    三者的包含关系:

    JDK = JRE + 开发工具集(例如Javac编译工具等)

    JRE = JVM + Java SE标准类库

    JVM是不能独立安装的;JRE和JDK都是可以独立安装的

    有单独的JDK安装包,也有单独的JRE安装包,没有单独的JVM安装包

    安装JDK的时候:JRE就自动安装了,同时JRE内部的JVM也就自动安装了

    安装JRE的时候:JVM也就自动安装了

    .java文件加载和执行流程如下 

  • 相关阅读:
    8 ActiveMQ的持久化
    Java File分隔符和 Path分隔符
    单元测试(JUint)
    力扣(LeetCode)243. 最短单词距离(2022.08.31)
    从十月稻田,看大米为何能卖出200亿市值?
    leetcode做题笔记164. 最大间距
    Flink CDC 实现Postgres到MySQL流式加工传输案例
    Redis源码与设计剖析 -- 10.列表对象
    数字化技术促进传统产业升级,看供应链SCM系统如何赋能锂电池制造业降本增效
    jna调用dll文件正常,但是怎么样初始化.ini文件,总是提示未找到.ini文件?
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126947384