说说 Java 的执行流程?
Java 的执行流程
Java 的执行流程包括多个阶段,从源码编写到最终程序的执行,涉及到编译、类加载、字节码执行、垃圾回收等多个环节。下面将详细介绍 Java 程序的执行流程。
1. 编写源代码
开发者首先在 IDE 或文本编辑器中编写 Java 源代码文件(以 .java 为扩展名)。源代码文件通常包括类定义、方法定义等。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
2. 编译源代码
编写完 Java 源代码后,使用 Java 编译器(javac)将其编译成字节码。字节码是 JVM 能够理解的中间代码,它与平台无关,因此 Java 可以在不同操作系统上运行。
命令:
javac HelloWorld.java
编译后,生成一个字节码文件 HelloWorld.class。此时,源代码已经转换为 JVM 可执行的字节码。
3. 类加载(Class Loading)
在 Java 程序运行时,JVM 会加载类文件。类加载是通过 类加载器 来完成的,类加载器根据需要加载类文件(例如 HelloWorld.class)。
类加载的过程可以分为几个阶段:
- 加载(Loading):将
.class文件加载到 JVM 中。 - 链接(Linking):验证类的正确性,准备类的内存布局。
- 验证(Verification):检查字节码的合法性。
- 准备(Preparation):为类变量分配内存,并设置初始值。
- 解析(Resolution):将符号引用转换为直接引用。
- 初始化(Initialization):为类的静态变量和静态代码块分配内存并执行初始化。
4. 字节码执行(JVM 执行字节码)
当类加载完成后,JVM 会通过 Java 的 执行引擎 来执行字节码。执行引擎包括以下几个组成部分:
- 解释器(Interpreter):逐行读取字节码并执行。解释器是简单的,但执行速度较慢。
- JIT 编译器(Just-In-Time Compiler):JIT 编译器将字节码转换为平台特定的机器代码,从而提高执行速度。JIT 编译器通常在程序运行时根据热点代码进行编译。
JVM 会通过调用 栈 来维护方法的调用状态,每个方法调用会创建一个栈帧来保存局部变量、操作数栈和方法返回地址。
5. 内存管理(堆与栈)
JVM 的内存管理是 Java 执行过程中的关键部分,主要包括以下内存区域:
- 方法区:存放类的元数据(如类的信息、常量池等)。在 Java 8 后,方法区被替换为 元空间(Metaspace)。
- 堆(Heap):用于存储对象实例。在垃圾回收期间,堆内存的对象会被回收,释放内存。
- 栈(Stack):存放局部变量和方法调用的栈帧。每个线程有一个独立的栈。
6. 垃圾回收(Garbage Collection)
Java 中的垃圾回收机制负责自动回收不再使用的对象,释放内存。垃圾回收通过标记、清除、压缩等方式回收堆内存中的对象。主要的垃圾回收器包括:
- Serial GC:单线程垃圾回收器。
- Parallel GC:多线程垃圾回收器。
- CMS(Concurrent Mark-Sweep):并发标记-清除垃圾回收器。
- G1(Garbage-First):面向大内存应用的垃圾回收器。
- ZGC:低延迟垃圾回收器。
垃圾回收的触发条件包括堆内存满、老年代的空间不足等。
7. Java 程序执行结束
当 Java 程序执行完毕时,JVM 会退出并释放所有资源,包括线程、文件句柄等。通常在程序正常结束时,JVM 会调用 System.exit() 方法,或者如果是主线程结束时,JVM 会自动退出。
8. 总结
Java 程序的执行流程包括以下步骤:
- 编写源代码:开发者编写
.java文件。 - 编译源代码:使用
javac编译器将源代码编译成字节码。 - 类加载:JVM 通过类加载器加载类文件,并进行验证、准备和初始化。
- 字节码执行:JVM 通过解释器或 JIT 编译器执行字节码。
- 内存管理:JVM 使用堆、栈和方法区来管理内存。
- 垃圾回收:JVM 自动回收不再使用的对象。
- 程序结束:程序执行完成后,JVM 退出并释放资源。
这个流程确保了 Java 程序能够高效、可靠地在不同平台上运行。
说说 Java 的执行流程?的更多相关文章
- 第一章 Java代码执行流程
说明:本文主要参考自<分布式Java应用:基础与实践> 1.Java代码执行流程 第一步:*.java-->*.class(编译期) 第二步:从*.class文件将其中的内容加载到内 ...
- Java 代码执行流程
Java 代码执行流程 类加载过程 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 类加载时机:代码使用到这个类时 验证阶段 &qu ...
- Dalvik虚拟机java方法执行流程和Method结构体分析
Method结构体是啥? 在Dalvik虚拟机内部,每个Java方法都有一个对应的Method结构体,虚拟机根据此结构体获取方法的所有信息. Method结构体是怎样定义的? 此结构体在不同的andr ...
- java控制执行流程
控制执行流程 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html java当中涉及到的关键字包括if-else.whil ...
- java方法执行流程解析
Java程序运行时,必须经过编译和运行两个步骤.首先将后缀名为.java的源文件进行编译,最终生成后缀名为.class的字节码文件.然后Java虚拟机将编译好的字节码文件加载到内存(这个过程被称为类加 ...
- 3-1Java程序的执行流程
3-1Java程序的执行流程 用记事本写一个简单的程序 存到:E:\java路径下 class HelloImooc{ public static void main(String[] agrg ...
- [Java编程思想-学习笔记]第4章 控制执行流程
4.1 return 关键字return有两方面的用途:一方面指定一个方法结束时返回一个值:一方面强行在return位置结束整个方法,如下所示: char test(int score) { if ...
- Java基础毕向东day05 对象与对象的区别,匿名内部类,函数的执行流程。
1.Car c = new Car(); Car c2 = new Car(); 1> c 和 c2之间的区别? public static void main(String[] args) { ...
- 深入理解java中HelloWorld的执行流程
HelloWorld.java是我们学习java的第一个程序,简单的再也不能简单了,可是里面的原理以及执行流程大家都知道吗?最近在复习java知识,特地钻研了一番分享给大家! 贴出HelloWorld ...
- Java中异常发生时代码执行流程
异常与错误: 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员) ...
随机推荐
- Vim编辑器退出的多种方法
当文本编辑结束之后,通常需要退出编辑器.退出编辑器又分为4种情况:保存退出.正常退出.不保存退出及强制退出.下面简单说下吧! 1.先介绍一下保存退出.当我们编辑或修改好了文件内容,如图. 我们 ...
- 深入理解Java泛型、协变逆变、泛型通配符、自限定
禁止转载 重写了之前博客写的泛型相关内容,全部整合到这一篇文章里了,把坑都填了,后续不再纠结这些问题了.本文深度总结了函数式思想.泛型对在Java中的应用,解答了许多比较难的问题. 纯函数 协变 逆变 ...
- 蝉联第一,天翼云电脑持续领跑中国DaaS市场!
近日,IDC发布的<中国虚拟桌面软件及云服务市场半年跟踪报告>数据显示,中国电信天翼云在2023年上半年中国桌面即服务(Desktop as a Service,以下简称"Daa ...
- Mac安装Prometheus + Grafana
一.安装Prometheus 1.下载安装 brew install prometheus 2.安装路径 /opt/homebrew/Cellar/prometheus/3.1.0 3.修改配置文件 ...
- Luogu P5089 元素周期表 / Codeforces 1012B Chemical table 题解 [ 并查集 ] [ 二分图 ] [ 图论建模 ] [ 棋盘覆盖问题 ]
双倍经验:Luogu P5089 元素周期表 ,CF1012B Chemical table:模拟赛搬的好题,有点厉害.赛时10min码的假贪心拿了五十多分,赢. 并查集思路 1 对于此类棋盘整行整列 ...
- 如何在啥也不懂的情况下将你的公众号接入DeepSeek或其它大模型
如何在啥也不懂的情况下将你的公众号接入DeepSeek或其它大模型 前言 最近国产大模型的"顶流"DeepSeek可谓是红得发紫,朋友圈刷屏的AI神回复.公众号爆款推文,都少不了它 ...
- DispatcherPriority 枚举
DispatcherPriority 枚举 ApplicationIdle 2 枚举值为 2. 在应用程序空闲时处理操作. Background 4 枚举值为 4. 在完成所有其他非空闲操作后处理操作 ...
- 大型语言模型(LLM)为什么处理日语这么“头大”?
引言 你有没有想过,为什么 AI 大神们处理日语时,总是会挠头?其实,这都要从"token"这个神奇的小东西说起. 在大型语言模型(LLM)中,token 就是文本的基本处理单位. ...
- [BZOJ3600] 没有人的算术 题解
妙不可言!妙绝人寰! 单点修,区间查,包是线段树的.考虑如何比较两节点大小. 考虑二叉搜索树,我们只要再给每个节点附一个权值,就可以比较了! 注意力相当惊人的注意到,假如给每个点一个区间 \([l_x ...
- SpringMVC - 谈谈你对SpringMVC的理解
谈谈你对 Spring MVC 的理解? 普通人:Spring MVC 它是一个MVC框架吧,就是,我们可以使用Spring MVC来开发Web应用...呃 它是基于Servlet上的一个扩展,就是它 ...