- 1. 跨平台的 java 语言
- 2. 跨语言的 jvm 平台
- 3. jvm 的位置
- 4. jdk、jvm、jre 的区别?
- 5. jvm 的整体结构
- 6. jvm 的生命周期
Java Virtual Machine(Java虚拟机),是虚拟出来的一个“操作系统”,在这个“操作系统”里面运行java程序的class字节码文件;JVM启动之后,在我们的电脑上或者服务器上表现出来的就是一个java进程,这个进程里面运行的是我们的Java程序;这个JVM本身是C语言开发的,并且不同的电脑操作系统是不同的版本,比如针对windows有windows的jvm,针对Linux有Linux的jvm;
问题思考:为什么说 java 是跨平台(Linux系统,Windows系统,Mac系统)的语言?
与C/C++不同,C/C++语言都是直接编译成针对特定平台的机器码。如果要跨平台,需要使用相应的编译器重新编译。而Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行 ( JVM 完成 )。字节码文件不再面向任何具体平台,只面Java向虚拟机。Java虚拟机是可运行Java字节码文件的虚拟计算机。不同平台的虚拟机是不同的,但它们都提供了相同的接口。
因此,Java语言具有一次编译,到处运行的特点。就是说编译后的.class可以跨平台运行,前提是该平台具有相应的Java虚拟机。
Java源程序先编译成二进制字节码的class文件,jvm解释执行class文件。就是因为java是运行在jvm上的,所以它的代码就能不经修改,就能在不同平台的jvm上运行 。
- 每个语言都需要转换成字节码文件,最后转换的字节码文件都能通过Java虚拟机进行运行和处理。
- 随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。
- Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。
- java 虚拟机的特点:一次到处运行、自动内存管理、自动垃圾回收功能
JVM是运行在操作系统之上的,它与硬件没有直接的交互,jvm 存在于操作系统上的 JRE 构建环境中。它是整个java实现跨平台的最核心的部分,由Java文件编译来的class文件,只有经过虚拟机解释才能被操作系统执行。
Java 程序是运行在 Java 虚拟机上的,在开发程序之前都要配置Java开发环境,其中首先要做的就是JDK的安装和配置,那么JDK、JVM、JRE到底有何联系和区别呢?
1、JDK (Java SE Development Kit)
Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。
下图是JDK的安装目录:
2、JRE ( Java Runtime Environment)
Java运行环境,用于解释执行Java的字节码文件。普通用户而只需要安装 JRE 来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。
下图是JRE的安装目录:里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
3、JVM (Java Virtual Mechinal)
Java虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。
当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。
4、区别与联系
JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
JDK 包含 JRE,JDK 和 JRE 中都包含 JVM。
JVM 是 java 编程语言的核心并且具有平台独立性。
5. jvm 的整体结构JVM 体系结构分为三部分:
类加载器(ClassLoader):用于装载 .class 文件
执行引擎:用于执行字节码或本地方法 ,包含三部分:解释器,即时编译器,垃圾回收器
运行时数据区:包括方法区、堆、Java 栈、PC 寄存器、本地方法栈
6. jvm 的生命周期1、虚拟机的启动:
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
2、虚拟机的执行:
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序程序开始执行时他才运行,程序结束时他就停止。执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
3、虚拟机的退出:
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统用现错误而导致Java虚拟机进程终止
- 某线程调用Runtime类或System类的exit( )方法,或Runtime类的halt( )方法,并且Java安全管理器也允许这次exit( )或halt( )操作。
- 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。



