首页 > 编程语言 >Java的加载与执行

Java的加载与执行

时间:2024-12-28 19:28:58浏览次数:6  
标签:Java 字节 JVM 执行 运行 加载

一、Java 程序的加载与执行主要涉及以下几个关键步骤:

在这里插入图片描述

1.编译:

首先,Java 源代码(.java 文件)通过 Java 编译器(javac)被编译成字节码文件(.class 文件)。在这个过程中,编译器会对源代码进行语法检查和语义分析,将其转换为符合 Java 字节码规范的中间表示形式。例如,如果有一个简单的Java 类 HelloWorld.java:

java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

使用 javac HelloWorld.java 命令进行编译后,会生成 HelloWorld.class 文件。

2.类加载

当运行 Java 程序时,Java虚拟机(JVM)会启动并负责加载字节码文件。类加载过程由类加载器(ClassLoader)完成,它遵循双亲委派模型。首先,会检查类是否已经被加载,如果没有,则从文件系统、网络或其他来源查找并加载字节码文件到内存中。例如,对于上述的HelloWorld 类,JVM 会通过类加载器将 HelloWorld.class 文件加载到内存中,并在方法区创建对应的类信息结构。

3.字节码验证

加载后的字节码需要经过验证,以确保其符合 Java 虚拟机规范,不会对 JVM造成安全威胁或执行错误。验证过程包括语法验证、语义验证和字节码流验证等。例如,验证字节码中的指令是否合法,操作数类型是否匹配等。

4.解释执行或编译执行

JVM 可以采用解释执行或编译执行的方式来运行字节码。在解释执行模式下,JVM会逐行读取字节码指令并在运行时进行解释执行,这种方式启动速度较快,但执行效率相对较低。而在编译执行模式下,JVM会使用即时编译器(JIT)将频繁执行的字节码片段编译成机器码,后续直接执行机器码,提高执行效率。例如,对于 HelloWorld 类中的main 方法,JVM 可能会先解释执行其中的字节码,当发现 System.out.println 方法被频繁调用时,JIT可能会将其相关字节码编译成机器码以加速执行。

5.运行时环境支持

在执行过程中,Java 程序可以通过 JVM 提供的运行时环境与操作系统和硬件进行交互。JVM提供了内存管理、线程管理、异常处理等功能。例如,当 HelloWorld 类中的 System.out.println 方法执行时,JVM会通过底层的输入输出流机制与操作系统的控制台进行交互,将字符串输出到屏幕上。 Java程序的加载与执行通过编译、类加载、字节码验证以及解释执行或编译执行等一系列步骤,在 JVM的支持下实现了跨平台的运行,并提供了丰富的运行时环境功能。

在这里插入图片描述

二、JDK、JRE、JVM分别是什么?他们的关系是什么?

1.JDK(Java Development Kit)

即 Java 开发工具包,是 Java 开发人员用于开发 Java 程序的软件包。它包含了 JRE和一系列开发工具,如编译器(javac)、调试器(jdb)、文档生成器(javadoc)等。这些工具能够帮助开发者将 Java源代码编写、编译成字节码文件,并进行调试和文档生成等操作。例如,使用 JDK 中的编译器可以将 .java 文件转换为 .class 文件。

组成:包括 JVM(Java 虚拟机,是 Java 程序真正运行的地方)、核心类库(Java预先写好可直接使用的代码集合)和众多开发工具(如 Java 编译器 javac、运行工具、调试工具 jdb 等)。
用途:程序员编写和运行Java 代码时需要安装 JDK。
在这里插入图片描述

2.JRE(Java Runtime Environment)

即 Java 运行时环境,是运行 Java 程序所必需的环境。它包括了 JVM 和 Java 核心类库。JRE 提供了 Java程序运行时所需的所有组件,使得 Java 字节码能够在不同的操作系统上运行。当用户运行一个已有的 Java 应用程序时,只需要安装 JRE 即可。

组成:包含 JVM、核心类库和运行时所需的一些工具(如运行代码的工具)。
用途:当只需运行已有的 Java 代码(class 文件)时,安装JRE 即可,相比 JDK 占用硬盘空间较小在这里插入图片描述
在这里插入图片描述
把 JVM 和核心类库还有在运行的时候所用到的一些工具单独的去抽离出来。又组成了一个 j re,那么这个 j re 呢?就是 JAVA 的运行环境。

3.JVM(Java Virtual Machine)

即 Java 虚拟机,是 Java实现跨平台的核心。它负责加载字节码文件,并将字节码解释或编译成目标机器的机器码在特定的操作系统和硬件平台上运行。不同的操作系统都有对应的JVM 实现。在这里插入图片描述

它们之间的关系是:JDK 包含 JRE,JRE 包含 JVM。在开发阶段,开发者需要安装 JDK 来进行 Java程序的开发;在运行阶段,用户只需要安装 JRE 就可以运行 Java 程序,而 JVM 则是 JRE 的核心组成部分,负责实际执行 Java字节码。
在这里插入图片描述

标签:Java,字节,JVM,执行,运行,加载
From: https://blog.csdn.net/m0_73941339/article/details/144791748

相关文章

  • vssadmin 命令工具功能分类的表格。vssadmin 是一个用于管理 Windows 卷影复制服务(Vol
    卷影复制服务(VSS)|MicrosoftLearnvssadmin|MicrosoftLearn vssadmin命令工具功能分类的表格。vssadmin是一个用于管理Windows卷影复制服务(VolumeShadowCopyService,VSS)的命令行工具,能够执行不同的操作以管理和维护影像副本及其存储。表格详细列出了所有支持的......
  • Java 并发编程:掌握多线程的四个核心要点
    Java并发编程是后端开发中至关重要的一部分,它涉及到如何有效地使用多核处理器、提高程序的执行效率,并确保线程安全。无论是面试还是实际项目开发,掌握多线程编程的核心要点都至关重要。本文将围绕Java多线程编程的四个核心要点展开,帮助读者深入理解并发编程的基本原理、应用......
  • 【Java 线程池】详解
    线程池详解在现代的Java并发编程领域,线程池扮演着至关重要的角色。它不仅能高效地管理线程资源,避免频繁创建和销毁线程带来的性能开销,还能提升系统整体的并发处理能力与稳定性。接下来,我们将深入剖析线程池的方方面面,包括其原理、核心组成部分、使用方法以及在实际项目......
  • 【Java 并发编程】详解
    Java并发编程在当今的软件开发领域,随着多核处理器的广泛应用以及对系统性能要求的不断提高,Java并发编程变得愈发重要。它允许我们充分利用计算机的多核资源,同时处理多个任务,提高程序的执行效率和响应能力。然而,并发编程并非易事,它涉及到诸多复杂的概念、机制以及需要注......
  • Java面试知识点总结:从基础到高级的全面指南
    在准备Java面试时,系统地覆盖从基础到高级的知识点是至关重要的。以下是一个详细的Java面试知识点总结,帮助你有针对性地准备面试。也算是我自己总结的知识点,先记录下来,说不定下次准备面试的时候,能再用上。1. Java基础在Java面试中,基础知识是考核的核心部分。掌握这些基础知识......
  • Java 课程一至六章综合复习总结
    姓名:李忠学号:202402150626《Java课程一至六章综合复习总结》第一章:初始Java与面向对象程序设计核心概念:Java语言的特点,如跨平台性、面向对象、安全性等。类与对象的基本概念,包括类的定义、对象的创建和使用。知识点:Java程序的基本结构,包含package语句、import语句......
  • 【JAVA篇】------ spring aop
    文章目录AOP(面向切面编程)前言一、AOP的概念二、AOP的核心概念三、AOP在Java中的应用场景1.整体介绍2.静态代理模式3.动态代理模式(JDK动态代理)总结AOP(面向切面编程)......
  • JAVA 7~8次题目集总结
    本次完成了7~8次的题目集是接着上次的家居强电电路模拟程序-1和家居强电电路模拟程序-2后续迭代功能拓展完成了家居强电电路模拟程序-3和家居强电电路模拟程序-4家居强电电路模拟程序-3相比较之前的升级了电路其中线路中包含多个串联起来的并联电路以及增加了新的受控电路元件......
  • Java难绷知识01——IO流的对象流
    Java难绷知识01之对象流本篇文章会探讨一些JavaIO流中比较容易被忽视的对象流,而且会相对的探讨其中的一些细节其中对于对象流的操作讲解会少一些,主要讨论的是一些细节在JavaIO流中,对象流(ObjectInputStream对象输入流和ObjectOutputStream对象输出流)用于将对象进行序列化和......
  • java三阶段总结(家用电路模拟)
    前言第六次题目集知识点:抽象类,抽象类不能被直接实例化!有抽象方法,抽象方法没有方法体,由继承它的子类提供具体实现。抽象类可以看作是一种模板,子类在实现接口方法时,必须实现接口中的所有抽象方法,除非子类也是抽象类在抽象类和接口中,多态体现为父类引用变量可以指向子类......