运行Java程序后,都发生了什么?

简介: 运行Java程序后,都发生了什么?

运行Java程序后,都发生了什么?

大家好呀,今天我们又开始了Java基础的学习之旅啦!上篇文章《javac 命令-详解》,我们认识了javac命令并能熟练运用,我们知道了如何编译一个java源程序,编译之后会在javac源文件同目录下生成一个.class 字节码文件。这个编译好之后的字节码文件就为我们之后的工作做了准备。



准备工作

  1. 使用编辑器编写一个java源代码,我这里使用的notepad++编辑器,编写一个“B.java”java源程序。
  2. 打开DOS窗口进入要编译的java源文件的目录下,输入“javac B.java” ,回车。
  3. 编译好的“B.class”文件在同目录下被生成。
  4. 运行字节码文件:在DOS窗口输入“java B”,回车。
  5. 内容在控制台上输出。

示意图


分析

上述中,当我们敲入 java B 回车 之后,我们的 B.class 字节码文件都发生了什么?

当一个字节码文件在Java命令执行之后运行时,涉及到两个主要方面的过程:加载和执行。这两个方面分别属于Java虚拟机(JVM)的不同阶段。下面是这两个方面的过程的总结:


加载阶段:

  1. 启动JVM:
    在命令行中使用java命令运行已编译的字节码文件时,JVM会被启动。
  2. 类加载器:
    JVM启动后,它会通过类加载器加载您指定的主类(包含public static void main(String[] args)方法)。类加载器在类路径(classpath)上查找字节码文件(.class文件)。
  3. 加载字节码:
    类加载器将找到的字节码文件加载到内存中,并在内存中创建类的表示。这些类的信息存储在方法区(Metaspace)中。

执行阶段:

  1. 解释执行字节码:
    加载类后,JVM会解释执行其中的字节码指令。这些指令是Java源代码编译而成的中间表示,JVM逐条解释执行这些指令。
  2. 即时编译(可选):
    在程序运行过程中,JIT编译器可能会识别频繁执行的热点代码。它会将这些代码块编译成本地机器代码,以提高执行速度。这些本地机器代码被存储在代码缓存中。
  3. 本地机器代码执行:
    即时编译器生成的本地机器代码在程序的后续执行阶段中被执行。这些本地机器代码更接近硬件,因此执行速度更快。
  4. 与操作系统和硬件交互:
    在程序执行过程中,JVM可能需要与操作系统进行交互,例如进行内存管理、I/O操作等。JVM通过调用操作系统提供的接口来实现这些功能。
  5. 程序结束:
    一旦主类的main方法执行完毕,程序会结束运行。JVM可以正常退出,也可以通过调用System.exit()来强制退出。

总结

java命令执行之后,一个字节码文件会被JVM加载并解释执行其字节码指令。如果有热点代码,JIT编译器可能会将其编译成本地机器代码。在执行过程中,JVM与操作系统和硬件交互,执行各种任务。最终,程序执行完毕,JVM可能会退出。这个过程允许Java实现"一次编写,到处运行"的特性,因为JVM在不同的平台上提供了统一的运行环境。


该文章收录在《java基础》专栏里,我会持续更新,希望同学们可以积极学习!

目录
相关文章
|
10天前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
31 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
7天前
|
XML 存储 JSON
Java程序部署
Java程序部署
|
10天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
27 1
|
8天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
18 5
|
9天前
|
Java 编译器 数据库连接
探索Java中的异常处理:提升程序的鲁棒性
【9月更文挑战第25天】在Java的世界里,异常是那些不请自来、令人头疼的“客人”。它们悄无声息地潜入我们的代码,一旦出现,便可能导致程序崩溃或行为异常。但是,如果能够妥善管理这些异常,我们就能将潜在的灾难转变为增强程序鲁棒性和用户体验的机会。本文将通过深入浅出的方式,带领读者理解Java异常处理的重要性,并提供实用的策略来优雅地处理这些意外情况。让我们一起学习如何在Java中捕捉、处理和预防异常,确保我们的程序即使在面对不可预见的错误时也能保持稳健运行。
|
15天前
|
监控 Java 数据库
Java程序如何进行不停机更新?
Java程序如何进行不停机更新?
17 1
|
1月前
|
缓存 监控 安全
如何提高 Java 高并发程序的性能?
以下是提升Java高并发程序性能的方法:优化线程池设置,减少锁竞争,使用读写锁和无锁数据结构。利用缓存减少重复计算和数据库查询,并优化数据库操作,采用连接池和分库分表策略。应用异步处理,选择合适的数据结构如`ConcurrentHashMap`。复用对象和资源,使用工具监控性能并定期审查代码,遵循良好编程规范。
|
2月前
|
Java 容器
【Azure Function App】Java Function在运行中遇见内存不足的错误
【Azure Function App】Java Function在运行中遇见内存不足的错误
|
2月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
96 0
|
2月前
|
Java Maven C++
【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
下一篇
无影云桌面