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项目实现关闭数据库配置和springSecurity

    SpringBoot项目实现关闭数据库配置和springSecurity

    这篇文章主要介绍了SpringBoot项目实现关闭数据库配置和springSecurity的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java连接MongoDB进行增删改查的操作

    Java连接MongoDB进行增删改查的操作

    这篇文章主要介绍了Java连接MongoDB进行增删改查的操作的相关资料,需要的朋友可以参考下
    2017-05-05
  • 解决Spring Mvc中对象绑定参数重名的问题

    解决Spring Mvc中对象绑定参数重名的问题

    最近在工作中遇到了参数绑定的一个问题,发现网上这方面的资料较少,索性自己来总结下,下面这篇文章主要给大家介绍了关于如何解决Spring Mvc中对象绑定参数重名问题的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • java中分组统计的三种实现方式

    java中分组统计的三种实现方式

    这篇文章主要介绍了java中分组统计的三种实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java日常练习题,每天进步一点点(40)

    Java日常练习题,每天进步一点点(40)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • SpringBoot如何优雅地使用Swagger2

    SpringBoot如何优雅地使用Swagger2

    这篇文章主要介绍了SpringBoot如何优雅地使用Swagger2,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 基于mybatis查询结果映射不到对象的处理

    基于mybatis查询结果映射不到对象的处理

    这篇文章主要介绍了mybatis查询结果映射不到对象的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解如何利用jasypt实现配置文件加密

    详解如何利用jasypt实现配置文件加密

    Jasypt (Java Simplified Encryption) 是一个 java 库,它允许开发人员以最小的成本将基本的加密功能添加到项目中,而无需深入了解密码学的工作原理。本文将利用jasypt实现配置文件加密,感兴趣的可以学习一下
    2022-07-07
  • java LeetCode题解KMP算法示例

    java LeetCode题解KMP算法示例

    这篇文章主要为大家介绍了java LeetCode题解KMP算法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Springboot异常日志输出方式

    Springboot异常日志输出方式

    这篇文章主要介绍了Springboot异常日志输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论