Java程序执行的全流程
作者:源末coco
这篇文章主要介绍了Java程序执行的全流程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Java程序执行流程
Java程序执行的整个过程可以分为三个阶段:编译、加载和运行
1.编译
Java程序的源代码需要经过编译器(例如javac)的编译,将其转换成字节码(即.class文件),这个过程称为编译。
编译器会对源代码中的语法进行检查和优化,并生成可在JVM上运行的字节码文件。
2.类加载
当Java程序启动时,JVM就会创建一个类加载器(ClassLoader)树来加载所有的类。
类加载器负责在运行时将类的字节码文件加载到内存中,并创建对应的Class对象。
类加载器会按照一定的顺序加载类,通常是先由系统类加载器(AppClassLoader)加载本地路径下的类,如果找不到则由扩展类加载器(ExtClassLoader)加载,最后由启动类加载器(BootstrapClassLoader)加载JRE中的核心类。
类加载器会执行以下三个步骤:
- 装载:查找并加载字节码文件;
- 链接:对字节码文件进行验证、准备和解析;
- 初始化:对类进行初始化,包括执行类的static块(如果有)和类变量的赋值。
3.执行
在加载完成后,JVM会执行main方法。具体执行过程如下:
- 创建主线程;
- 将main方法所在类的字节码文件装载到JVM内存中;
- 执行该类的static代码块(如果有);
- 如果该类有父类,依次执行其父类的static代码块(如果有);
- 执行main方法。
在执行main方法时,JVM将会按照程序员编写的语句依次执行,在执行完毕后,程序结束。
4.垃圾回收
在Java程序执行过程中,JVM需要管理内存,包括分配、使用和释放内存。
当一个对象不再被引用时,JVM会通过垃圾回收机制将其回收并释放内存。
垃圾回收器会定期扫描堆内存中的对象,标记不再被引用的对象为垃圾对象,然后清理掉这些对象所占用的内存空间。
Java代码执行Linux命令
说明:项目必须是部署在Linux服务器中才能生效。
1.工具类
@Controller
public class ExecuteNewFlowUtil {
/**
* 运行Linux命令
* @author YuanRiKang
* @date 2022/5/24 16:56
* @param commands 命令集合
* @return 返回结果
*/
public List<String> executeNewFlow(List<String> commands) {
List<String> rspList = new ArrayList<String>();
Runtime run = Runtime.getRuntime();
try {
Process proc = run.exec("/bin/bash", null, null);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
for (String line : commands) {
out.println(line);
}
out.println("exit");// 这个命令必须执行,否则in流不结束。
String rspLine = "";
while ((rspLine = in.readLine()) != null) {
System.out.println(rspLine);
rspList.add(rspLine);
}
proc.waitFor();
in.close();
out.close();
proc.destroy();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return rspList;
}
}2.方法执行代码段
//运行命令生成对比信息
List<String> generateComparativeInformationCommands = new ArrayList<>();
generateComparativeInformationCommands.add("命令1");
generateComparativeInformationCommands.add("命令2");
generateComparativeInformationCommands.add("命令3");
executeNewFlowUtil.executeNewFlow(generateComparativeInformationCommands);总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
