运行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基础》专栏里,我会持续更新,希望同学们可以积极学习!

目录
相关文章
|
4月前
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
利用java8 的 CompletableFuture 优化 Flink 程序
|
4天前
|
传感器 安全 算法
消防救援支队消防员单兵装备智能养护舱电机驱动java版程序(二)
本文探讨消防救援中智能养护舱电机驱动的Java程序设计,作为系列文章第二部分。通过自动化和智能化手段,智能养护舱提升了装备维护效率与准确性。文章详细介绍了电机驱动模块的设计与实现,包括硬件选型、PID控制策略、安全保护机制及Java程序架构,确保电机精确控制、稳定性和安全性。未来将优化功能并引入智能算法和物联网技术,进一步提升装备维护智能化水平。
|
4天前
|
IDE Java 开发工具
消防救援支队消防员单兵装备智能养护舱点击驱动java版程序(一)
智能消防作战服架通过电机驱动系统提升消防员作业效率和安全性。本文介绍基于Java的电机驱动程序开发,涵盖硬件准备、软件环境搭建及驱动程序实现。重点包括串口通信配置、电机控制类设计与控制逻辑实现,确保电机高效稳定运行。通过正确配置通信协议和串口参数,并添加异常处理机制,保障系统的安全性和可靠性。
|
3月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
65 2
|
3月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
122 1
|
4月前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
304 5
|
4月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
648 2
|
4月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
197 1
|
4月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
125 1
|
4月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
56 0