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

目录
相关文章
|
3月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
116 2
|
1月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
288 98
|
7月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
482 7
|
2月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
8月前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
141 4
|
8月前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
287 0
|
8月前
|
Java 编译器
课时7:Java程序基本概念(注释)
课时7介绍了Java程序中的注释。编程语言有其语法和语义,注释有助于理解代码需求,防止断档。Java支持三类注释:单行(//)、多行(/* */)和文档注释(/** */)。注释不会被编译器编译。范例中展示了如何在代码中使用注释,并强调了注释对项目文档管理的重要性。
150 3
|
8月前
|
存储 Java 数据库连接
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
|
8月前
|
Java 开发工具
课时5:第一个Java程序
课时5介绍了编写第一个Java程序的步骤,包括创建Hello.java文件、编写“Hello World”代码、编译和运行程序。主要内容有:1) 新建并编辑Hello.java;2) 编译Java源文件生成.class文件;3) 通过命令行解释执行Java程序;4) 解释主方法的作用及信息输出操作。本课强调了类定义、文件命名规则和基本程序结构的重要性,并建议初学者使用记事本编写代码以熟悉基础语法。
154 0