如何运行java(java程序运行步骤)

80酷酷网    80kuku.com

JDK的组成

如何运行java(java程序运行步骤)(图1)

JDK

  • JDK:JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。JDK中包含JRE(在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre)和一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
  • Java Runtime Environment(JRE):是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
  • JVM(java virtual machine):就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。

JVM体系结构

JVM就是运行在操作系统之上的一个软件

如何运行java(java程序运行步骤)(图2)

JVM体系结构

JVM的组成:

  • 类加载子系统 Class loader
  • 运行时数据区 JVM 内存模型
  • 执行引擎

为什么 Java 要在虚拟机里运行

简单的来说,Java作为一门高级程序语言,语法复杂,抽象度高,直接在硬件上运行这种复杂的程序并不现实;所以JAVA的设计者就设计一个面向 Java 语言特性的虚拟机,并通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列(Java 字节码)。Java字节码会被虚拟机翻译为可以被机器识别的机器码,这也实现了Java的跨平台(相同的代码可以在不同操作系统的JVM中运行)

虚拟机的第二个好处就是带来了一个托管环境,托管环境能够代替我们处理代码中冗余并且容易出错的部分,比如自动内存管理,垃圾回收、 还有诸如数组越界、动态类型、安全权限等等动态监测。

JVM是怎样运行 Java 字节码的

执行 Java 代码首先需要将它编译而成的 class 文件加载到 JVM虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码;Java 虚拟机会在内存中划分出堆和栈来存储运行时数据。JVM会将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器。

如何运行java(java程序运行步骤)(图3)

JVM加载字节码

在运行过程中,每当进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。当退出当前执行的方法时,不管是正常返回还是异常返回,JVM均会弹出当前线程的当前栈帧,并将之舍弃。

当然Java 字节码是无法在硬件上直接执行的,所以JVM需要将字节码翻译成机器码。

在 HotSpot 里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行。

如何运行java(java程序运行步骤)(图4)

JVM执行字节码

  • 解释执行:无需等待编译,在运行的过程中,需要的时候编译然后执行
  • 即时编译:JVM先将字节码编译为机器码,然后在执行,所以在实际运行中速度更快。

HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: