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);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。