一、开发代码到程序运行整个流程
准备开发环境---编写代码---编译代码---测试---部署---运行程序。
1. 准备开发环境
下载和安装软件:
- 开发工具包:Java开发,需要下载并安装Java开发工具包(JDK)。
- 集成开发环境(IDE):如IntelliJ IDEA、Eclipse、Visual Studio等,这些IDE提供代码编辑、调试和其他开发功能。
- 版本控制系统:如Git,用于代码版本管理和团队协作。
- 构建工具:例如,对于Java,可能需要Maven或Gradle来管理项目依赖和构建过程。
- 数据库:如果项目需要数据库,需要安装数据库软件,如MySQL、PostgreSQL等。
配置环境:
- 环境变量:设置如
JAVA_HOME
和PATH
等环境变量,确保命令行工具可以正确执行。 - IDE配置:配置IDE,包括安装必要的插件、设置编码格式和代码风格等。
2. 编写代码
- 在IDE中创建新项目或克隆现有的代码库。
- 使用IDE或文本编辑器编写源代码。
- 管理项目依赖和库。
3. 编译代码
- 使用IDE内置的编译功能或命令行工具(如
javac
)编译代码,生成可执行文件或字节码。
4. 测试
- 单元测试:编写和运行单元测试来验证代码的各个部分是否按预期工作。
- 集成测试:确保不同的代码模块能够正确集成和协同工作。
- 系统测试:在完整的系统或类似生产环境中运行应用程序,确保所有功能和性能指标符合要求。
5. 部署
- 将代码部署到测试服务器或生产环境。
- 使用部署工具(如Jenkins、Docker)来自动化部署过程。
6. 运行程序
- 在服务器或客户端运行程序。
- 监控程序性能和稳定性。
7. 维护和更新
- 根据反馈和监控结果对代码进行维护和更新。
- 重复测试、部署和监控的步骤以确保更新的质量。
在整个过程中,研发人员可能还需要使用其他工具和服务,如API测试工具(Postman)、性能测试工具(JMeter)、错误跟踪系统(JIRA)、文档管理系统(Confluence)等,以支持开发工作的不同方面。此外,根据项目的具体需求,可能还需要配置和使用其他专门的软件和环境。
二、JVM定义
1.是什么
JVM(Java Virtual Machine)简称Java虚拟机,也就是一个虚拟的计算机,一个抽象的计算机,为运行Java字节码提供了一个运行时环境。存在于软件层面,通过在实际的物理硬件上模拟虚拟机指令集来运行Java应用程序,不依赖于任何特定的底层硬件和操作系统。因此Java程序可以在任何安装有JVM的系统上运行,无需修改代码。JVM是Java技术的核心组成部分,使得Java能够实现“一次编写,到处运行”(Write Once, Run Anywhere,WORA)的跨平台特性。
2.从哪来
不是每台电脑默认都有JVM(Java虚拟机),运行Java程序必须有JVM,但它不是操作系统的标准组件,需要用户自行安装。通常,当安装Java开发工具包(JDK)或Java运行时环境(JRE)时,JVM就会作为安装包的一部分被安装到你的电脑上。
- JDK:Java Development Kit,开发Java应用程序的软件开发环境,包括了JVM、Java编译器(javac)、Java库(rt.jar)等开发工具和资源。
- JRE:Java Runtime Environment,运行Java应用程序所需的环境,包括JVM、Java类库等运行时组件。
如果电脑上没有安装Java或者安装的是没有包含JVM的其他程序,那么电脑就不会有JVM。只有安装了JDK或JRE之后,电脑上才会有JVM。
总结来说,电脑上是否有JVM取决于是否安装了Java,而不是单纯地安装Java的jar包。Jar包是Java归档文件,用于分发和部署Java应用程序,但它本身并不包含JVM。
3.作用
-
跨平台运行: JVM为Java字节码提供了一个跨平台的运行环境。Java源代码被编译成字节码(.class文件),这些字节码可以在任何实现了JVM规范的虚拟机上运行。
-
内存管理: JVM负责Java程序中内存的分配和管理。它提供了垃圾收集(Garbage Collection)机制,自动回收不再使用的对象,减轻了程序员手动管理内存的负担。
-
安全性: JVM提供了一个安全的运行环境,通过沙箱机制限制Java程序的行为,防止恶意代码对宿主系统造成破坏。
-
优化性能: JVM在运行时可以通过即时编译(Just-In-Time, JIT)将热点代码编译成优化的机器码,提高程序的执行效率。
-
执行环境: JVM提供了执行环境,包括运行时数据区、执行引擎等,用于执行字节码指令、调用本地系统资源。
-
多语言支持: 虽然JVM最初是为Java设计的,但现在它也支持其他语言(如Scala, Kotlin, Groovy等)的运行,只要这些语言可以编译成JVM可以执行的字节码。
总之,JVM是Java平台的基石,它不仅使得Java具有跨平台的能力,还提供了内存管理、安全性保护和性能优化等重要的功能。
三、组成
Java虚拟机(JVM)是一个复杂的系统,包含多个组件和子系统,共同工作以执行Java字节码。
1、类加载器(Class Loader)
类加载器负责从文件系统或网络位置加载Java类(.class文件),将它们的内容转换成运行时数据结构,并在JVM内存中创建相应的Class对象。
public class Test {
public void calculate(int num) {
int b = num + 1;
System.out.println(b);
}
public static void main(String[] args) {
Test test = new Test();
test.calculate(1);
}
}
当研发人员写完上述代码,运行main方法(执行程序)时,JVM(Java 虚拟机)会按照以下步骤来执行这段代码
编译阶段:开发工具运行时自动编译,通过 Java 编译器(如 javac
)将源代码编译成 .class
字节码文件。会生成 Test.class
文件。
类加载阶段: 当程序启动并执行 Test
类的 main()
方法时,JVM 的类加载器会找到 Test.class
文件,并将其加载到 JVM 中。加载过程中,类加载器会验证字节码文件的结构、元数据和符号引用,确保它们符合 JVM 规范。同时类的加载需要符合双亲委派模型
内存分配:JVM 为 Test
类创建对应的类对象,例子中,Test类的字节码信息将被加载到方法区。在执行 main()
方法时,遇到 Test test = new Test();
这一行,JVM 会在堆区为 Test
对象分配内存空间,并调用其构造函数初始化对象。Test类的一个实例(即test对象)会被分配在堆上。
方法执行:它会在当前线程的Java方法栈上为 hello()
方法创建一个新的栈帧,用于存放局部变量表、操作数栈和其他运行时信息。 局部变量表中分配空间给形参 a
并初始化为传入的值 1。根据字节码指令计算 a+1
,并将结果赋值给局部变量 b
。
执行完毕后,hello()
方法完成其逻辑且无返回值,因此栈帧被弹出,控制权返回到 main()
方法的栈帧。如果程序中使用了 native 方法(本地方法),那么本地方法栈将会涉及到,但在这里并没有使用 native 方法。当执行到 test.hello(1);
时,JVM 查找 hello()
方法的字节码指令并开始执行。
2、运行时数据区(Runtime Data Areas)
JVM在执行Java程序时用来存储数据的内存区域
2.1堆(Heap):存储所有类实例和数组,是垃圾收集器管理的主要区域。
2.2Java栈(Java Stack):存储局部变量和部分结果,并且在方法调用和返回时参与方法调用的过程。
2.3本地方法栈(Native Method Stack):为JVM使用到的Native方法服务。
2.4程序计数器(Program Counter Register):当前线程执行的字节码的行号指示器。
2.5方法区(Method Area)
存储类信息、常量、静态变量等。
3、执行引擎(Execution Engine)
执行引擎负责执行字节码指令。它可以通过解释执行(逐条解释字节码)或即时编译(将字节码编译成本地机器码)来执行指令。
4、本地方法接口(Native Method Interface, JNI)
JNI定义了一种标准,允许Java代码和其他语言写的应用程序或库进行交互,这些其他语言的代码段称为Native方法。
5、本地方法库(Native Libraries)
这些库包含用其他语言(如C或C++)编写的特定于平台的实现,可以通过JNI被JVM调用。
6、垃圾收集器(Garbage Collector, GC)
垃圾收集器是JVM的一个重要部分,负责自动管理Java堆内存。它定期识别并回收不再使用的对象,释放内存资源。
粗略写了下框架,白天继续........