Java程序执行的全流程

 更新时间:2024年01月29日 09:06:42   作者:源末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);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 3分钟纯 Java 注解搭个管理系统的示例代码

    3分钟纯 Java 注解搭个管理系统的示例代码

    这篇文章主要介绍了3分钟纯 Java 注解搭个管理系统的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • SpringBoot 如何根据不同profile选择不同配置

    SpringBoot 如何根据不同profile选择不同配置

    这篇文章主要介绍了SpringBoot 如何根据不同profile选择不同配置的操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot 配置文件配置项前缀为0的数字特殊处理方式

    springboot 配置文件配置项前缀为0的数字特殊处理方式

    这篇文章主要介绍了springboot 配置文件配置项前缀为0的数字特殊处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SSM框架实现分页和搜索分页的示例代码

    SSM框架实现分页和搜索分页的示例代码

    本篇文章主要介绍了SSM框架实现分页和搜索分页的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Mybatis增删改查mapper文件写法详解

    Mybatis增删改查mapper文件写法详解

    这篇文章主要介绍了Mybatis增删改查mapper文件写法的相关资料,需要的朋友可以参考下
    2017-03-03
  • SpringBoot2.3新特性优雅停机详解

    SpringBoot2.3新特性优雅停机详解

    这篇文章主要介绍了SpringBoot2.3新特性优雅停机详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • SpringBoot Redis 发布订阅模式(Pub/Sub)的具体使用

    SpringBoot Redis 发布订阅模式(Pub/Sub)的具体使用

    本文主要介绍了SpringBoot Redis 发布订阅模式(Pub/Sub)的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java微信分享接口开发详解

    Java微信分享接口开发详解

    这篇文章主要为大家详细介绍了Java微信分享接口开发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • java DelayQueue的原理浅析

    java DelayQueue的原理浅析

    在本篇文章里小编给大家整理的是一篇关于java DelayQueue的原理浅析,有兴趣的朋友们可以参考学习下。
    2021-01-01
  • java中字符串常见的方法及总结

    java中字符串常见的方法及总结

    这篇文章主要介绍了java中字符串常见的方法及总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论