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);

总结

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

相关文章

  • Java HttpClient-Restful工具各种请求高度封装提炼及总结

    Java HttpClient-Restful工具各种请求高度封装提炼及总结

    这篇文章主要介绍了Java HttpClient-Restful工具各种请求高度封装提炼及总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java实现/创建线程的几种方式小结

    java实现/创建线程的几种方式小结

    在JAVA中,用Thread类代表线程,所有线程对象都必须是Thread类或者Thread类子类的实例,下面这篇文章主要介绍了java实现/创建线程的几种方式,需要的朋友可以参考下
    2021-08-08
  • java如何根据用户请求获取ip地址并解析省市信息

    java如何根据用户请求获取ip地址并解析省市信息

    根据当前用户本地IP地址,查询IP地址库,获取IP所在的省市信息,目前有多种方式实现该功能,这篇文章主要给大家介绍了关于java如何根据用户请求获取ip地址并解析省市信息的相关资料,需要的朋友可以参考下
    2023-12-12
  • Java中final关键字的用法总结

    Java中final关键字的用法总结

    在Java中,final可以别用来修饰类、修饰方法、修饰变量和修饰参数等,这里就来简单作一个Java中final关键字的用法总结:
    2016-06-06
  • Java获取时间差(天数差,小时差,分钟差)代码示例

    Java获取时间差(天数差,小时差,分钟差)代码示例

    这篇文章主要介绍了Java获取时间差(天数差,小时差,分钟差)代码示例,使用SimpleDateFormat来实现的相关代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java 停止线程需要注意的地方

    Java 停止线程需要注意的地方

    这篇文章主要介绍了Java 停止线程需要注意的地方,帮助大家更好的理解和学习Java线程的相关资料,感兴趣的朋友可以了解下
    2020-09-09
  • SpringMVC中的ConversionServiceExposingInterceptor工具类解析

    SpringMVC中的ConversionServiceExposingInterceptor工具类解析

    这篇文章主要介绍了SpringMVC中的ConversionServiceExposingInterceptor工具类解析,ConversionServiceExposingInterceptor是Spring MVC的一个HandlerInterceptor,用于向请求添加一个属性,需要的朋友可以参考下
    2023-12-12
  • Java中MapStruct映射处理器报错的问题解决

    Java中MapStruct映射处理器报错的问题解决

    MapStruct是一个强大的Java映射框架,它能够在编译时生成映射代码,,本文主要介绍了Java中MapStruct映射处理器报错的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • spring IOC容器管理必须知道的一些操作(基于XML方式)

    spring IOC容器管理必须知道的一些操作(基于XML方式)

    Spring框架的核心是Spring容器,容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期,下面这篇文章主要给大家介绍了关于spring IOC容器管理必须知道的一些操作,需要的朋友可以参考下
    2022-03-03
  • Java SimpleDateFormat与System类使用示例详解

    Java SimpleDateFormat与System类使用示例详解

    这篇文章主要介绍了Java SimpleDateFormat与System类使用示例,对于SimpleDateFormat类,是一个用来区分区域设置的方式进行日期的是指,以及对日期进行处理分析的一个实现类
    2022-11-11

最新评论