Java中程序的运行全过程

 更新时间:2023年03月01日 11:11:05   作者:Lin_Dong_Tian  
这篇文章主要介绍了Java中程序的运行全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java程序运行过程

运行一个Java程序的步骤

1、编辑源代码xxx.java

2、编译xxx.java文件生成字节码文件xxx.class

3、JVM中的类加载器加载字节码文件

4、JVM中的执行引擎找到入口方法main(),执行其中的方法

一、从源码到字节码

从我们写的java文件到通过编译器编译成java字节码文件(也就是.class文件),这个过程是java编译过程;

字节码文件:真正实现了java语言的跨平台。各种不同平台的虚拟机都统一使用这种相同的程序存储格式。

更进一步说,jvm运行的是class字节码文件,只要是这种格式的文件就行,所以,实际上jvm并不像我之前想象地那样与java语言紧紧地捆绑在一起。

把一个简单的HelloWorld程序生成的字节码文件重定向为txt文件:

javap -v HelloWorld > HelloWorld.class.txt,部分信息如下

一份字节码文件包含了魔数与 Class 文件的版本,常量池,访问标志等等信息,总之,字节码文件很简单很强大,它存放了这个类的各种信息:字段、方法、父类、实现的接口等各种信息。 

二、JVM虚拟机运行时数据区

Java虚拟机要运行字节码指令,就要先加载字节码文件,谁来加载,怎么加载,加载到哪里……谁来运行,怎么运行呢?

JVM在执行Java程序的过程中会把它所管理的内存分为若干个不同的区域,这些区域都有各自的用途。

1、程序计数器:可以看作是当前线程所执行的字节码的行号指示器(指示当前线程,所以是线程私有的),字节码解释器工作时需要通过改变这个程序计数器的值来选取下一条所需要执行的字节码指令,循环、跳转、异常处理、线程恢复等基础功能都要依赖它来完成。

2、JVM栈:描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接和方法出口等信息。每一个方法从调用直到执行完成的过程,就对应一个栈帧从虚拟机栈中入栈到出栈的过程。

3、本地方法栈:虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机所使用到的Native方法服务。

4、堆:是被所有线程共享的一块区域,在虚拟机创建是创建,此内存的唯一目的是存放对象实例,它也是垃圾收集器管理的主要区域。

5、方法区:也是所有线程共享的一块区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区中有运行时常量池。

总结:JVM的功能模块主要包括类加载器、执行引擎和垃圾回收系统。 

三、类加载器加载xxx.class到内存

虚拟机把描述类的数据从字节码文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 

四、虚拟机字节码执行引擎

执行引擎找到main()这个入口方法,执行其中的字节码指令。

执行引擎处理过程:输入字节码文件,进行字节码解析的等效过程,输出执行结果。

总结

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

相关文章

  • SpringBoot整合Minio实现上传文件的完整步骤记录

    SpringBoot整合Minio实现上传文件的完整步骤记录

    MinIO是一个基于Apache License v2.0开源协议的对象存储服务,它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,下面这篇文章主要给大家介绍了关于SpringBoot整合Minio实现上传文件的完整步骤,需要的朋友可以参考下
    2022-05-05
  • Netty分布式Future与Promise执行回调相关逻辑剖析

    Netty分布式Future与Promise执行回调相关逻辑剖析

    这篇文章主要为大家介绍了Netty分布式Future与Promise执行回调相关逻辑剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java详解聊天窗口的创建流程

    Java详解聊天窗口的创建流程

    这篇文章主要介绍了怎么用Java来创建一个聊天窗口,聊天软件我们经常要用,但是你有想过自己怎么去实现它吗,感兴趣的朋友跟随文章往下看看吧
    2022-04-04
  • Spring中@Autowire注入的深入讲解

    Spring中@Autowire注入的深入讲解

    这篇文章主要给大家介绍了关于Spring中@Autowire注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringCloud Ribbon 负载均衡的实现

    SpringCloud Ribbon 负载均衡的实现

    Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制。这篇文章主要介绍了SpringCloud Ribbon 负载均衡的实现,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • springBoot整合Eureka启动失败的解决方案

    springBoot整合Eureka启动失败的解决方案

    这篇文章主要介绍了springBoot整合Eureka启动失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java面向接口编程之简单工厂模式示例

    Java面向接口编程之简单工厂模式示例

    这篇文章主要介绍了Java面向接口编程之简单工厂模式,结合实例形式详细分析了java面向接口编程简单工厂模式的具体定义与使用方法,需要的朋友可以参考下
    2019-09-09
  • Java趣味练习题之输出两个日期之间的相隔天数

    Java趣味练习题之输出两个日期之间的相隔天数

    本篇文章介绍了我看到的一个趣味小题目,怎么求得两个日期之间相隔的天数,以及解决该题目的过程及思路,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-10-10
  • Java中多态性的实现方式

    Java中多态性的实现方式

    这篇文章主要介绍了Java中多态性的实现方式,什么是多态?通过简单的一道题目帮大家理解java多态性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • idea启动springboot报错: 找不到或无法加载主类问题

    idea启动springboot报错: 找不到或无法加载主类问题

    这篇文章主要介绍了idea启动springboot报错: 找不到或无法加载主类问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论