Java虚拟机提供了多种字节指令,用于执行Java程序,Java代码的运行过程包括从源代码编译成字节码文件(.class),再通过JVM进行读取和执行的过程,Class文件和字节码文件不同,前者是一种描述方式可包含其他类型的已编译过的文件格式;后者特指针对JVM的文件格式。"javap"是JDK提供的反汇编和分析工具,运行Java程序的流程涉及多个步骤和细节如类装载、链接及初始化等。
Java代码的运行过程是一个从源代码到字节码,再到机器码的转换和执行的过程。
- 编写源代码:程序员使用高级编程语言(如Java)在文本编辑器或集成开发环境(IDE)中编写代码,这些代码以
.java为扩展名保存,且文件名必须与公共类的名称完全匹配。 - 编译生成字节码:通过Java编译器(javac)将Java源代码编译成
.class字节码文件,这个阶段是Java的一次性编译部分。 - 类加载:当运行Java程序时,JVM会通过类加载器把
.class文件加载进内存中。 - 解释执行/即时编译:JVM可以将字节码进行解释执行或者将其中的一部分进行即时编译(JIT),转化为更接近于特定硬件平台的机器码以提高效率,这也是为什么Java能做到“一次编写,到处运行”。
- 运行时管理与其他交互:除了基本的执行外,JVM还需要处理诸如垃圾回收、线程管理等任务,并可能与其他系统组件进行交互以确保程序的正常运行。
- 由于Java是在JVM上虚拟运行的,并非直接在真实硬件环境下操作,因此JVM的实现质量对代码的执行有重要影响;不同平台上的JVM可能会有细微差别导致行为略有差异。
Class文件和字节码文件的区别
Class文件和字节码文件都是Java程序的重要组成部分,但它们有着不同的定义和用途:
- Class文件:它是Java源代码经过编译后的二进制文件,它包含了类的结构信息、字段、方法等,并且这种文件是平台无关的,可以在任何支持Java的平台上运行。
- 字节码文件(即
.class文件):这是由Javac编译器生成的中间产物,包含的是一种特殊的指令集,被称为字节码,这种指令集设计得可以被Java虚拟机(JVM)高效地解析和执行,而无需提前转换成真正的机器代码。
简而言之,Class文件是一种泛指的描述方式,可以包括其他类型的已编译过的文件形式;而字节码文件则特指针对JVM的文件格式。
Java程序是如何执行的?
Java程序的执行主要涉及以下几个步骤:
-
开发者首先用Java编程语言写好源文件(后缀名为 .java)。
-
使用JDK中的工具javac将这些源文件编译成字节码形式的 .class 文件,这一步通常称为"编译"。
-
当需要启动一个程序的时候,它会调用 JVM 来读取 class 文件里的内容并进行相应的动作来开始执行整个程序流程,这包括了初始化变量和方法等等一系列复杂的工作流过程以及资源分配工作都交给了 JVM 去完成 ,同时如果遇到一些复杂的逻辑运算或者是循环语句等情况时候可能会涉及到 JIT 技术去优化性能问题使得整体更加流畅快速地进行下去。,此外还有许多其他的细节比如异常捕获和处理机制也都在其中起着重要作用 ,总之这是一个非常庞大而且精细的系统工程确保了 Java 的跨平台性和高可靠性等特点得以实现 。
(注: 在此过程中还涉及到很多子进程例如类装载(ClassLoader)、链接(Linking)及初始化(Initialization),这里只做简要概述。)
简单聊聊 javap 命令
javap 是 JDK 提供的一个用于反汇编和分析 Java 类文件的实用工具,其基本用法如下:
- 基本语法只需输入
javap后跟要查看的类名即可,如javap KunKun或javap -c KunKun(后者带有详细输出选项),该命令可以帮助我们了解某个类的包名、继承关系等信息及其方法的访问权限修饰符等元数据信息。 - 它提供了多种操作符如
version,v(l) 和public|protected|default等用来控制输出的内容和详略程度。 通过加上-v可以显示详细的行号和其他调试信息; 而加上-l则可展示本地变量的表项详情等更多信息供分析之需.,这样我们可以更好地理解所编写的 Java 程序中各个部分的构成情况从而有助于排查问题和改进程序设计思路等目的达成目标需求满足用户期望值提升用户体验满意度!
就是关于 javap 的一些基础介绍和使用说明希望对你有所帮助!

















