Java之源文件的执行全过程

 更新时间:2024年03月25日 16:37:07   作者:perseveregz  
这篇文章主要介绍了Java之源文件的执行全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.JVM

1.定义:Java虚拟机

2.作用:运行Java字节码文件

3.实现方式:针对不同的操作系统(Windows、MacOS、Linux)存在不同的实现方式。目的是运行相同的Java字节码文件,在不同系统中给出相同的结果

4.自定义JVM:只要满足JVM规范,就可以自定义自己的JVM

2.字节码

1.定义:字节码就是JVM能够处理的代码,是面向虚拟机

2.优点:由于字节码是面向虚拟机的,因此在不同操作系统可以无需重新编译;并且执行效率高

3.Java源文件执行的过程

过程:Java源文件--->javac编译--->.class文件(字节码文件)--->解释运行--->机器码

重点:字节码文件到机器码这一过程中,Java的类的加载器需要先将字节码文件加载到内存中,然后解释器开始逐行解释执行,这样做效率低。

引入JIT(just in Time Compilation)运行时编译器,能够在编译后将字节码文件对应的机器码保存下来,机器码的运行效率是比较高的。

4.JIT(Just In Time Compilation)

1.定义:运行时编译器;在对字节码文件解释运行时边运行边编译,并将编译后字节码文件对应的机器码保存下来,从而提高程序运行效率

2.优点:根据内存中实际情况调整代码;根据运行情况生成最优机器指令序列

缺点:需要占用运行时资源,导致程序卡顿;编译准备和识别时会占用时间,使得初始编译不能达到最高性能

5.AOT(Ahead Of Time Compilation)

1.定义:提前编译器对字节码文件在执行前就编译为机器码;可以减少JIT初始编译时无法达到最高性能的问题 

2.优点:在程序编译前编译,避免在运行中占用系统资源;在程序运行初期就达到最高性能

缺点:提前编译会占用更多外存;牺牲了Java的动态性

6.AOT破坏Java动态性

Java中的反射机制是动态获取运行时类的对象及调用运行时类的方法,此时只能采用JIT进行编译;

采用AOT,则全部已经提前编译,无法动态的修改运行时类的属性

7.编译型语言与解释型语言

编译型:通过编译器将源代码一次性翻译为可以被平台执行的机器码

  • 优点:执行速度快
  • 缺点:开发效率低
  • 实例:C、C++、Go

解释型:通过解释器将代码逐行解释为机器码后,被平台执行

  • 优点:开发效率高
  • 缺点:执行速度慢
  • 实例:Python、JavaScript

8.Java-编译与解释并存的语言

为改善编译语言的效率,将编译和运行相结合,使得具有编译语言和解释语言二者的优点。

在Java中,先将程序源代码编译为字节码文件;在执行时,再将字节码文件解释为机器码

9.Java和C++的相同点与不同点

相同点:都是面向对象的语言;都支持封装、继承、多态

不同点:

  • Java不提供指针直接访问内存,程序更安全
  • Java类是单继承,C++的类支持多继承
  • Java存在GC垃圾自动回收,无法手动释放无用内存
  • C++支持方法重载和操作符重载Java只支持方法重载

10.Oracle JDK 和 Open JDK

Sun公司2006将Java开源,因此有了Open JDK

Oracle公司2009年收购了Sun公司,在Open JDK基础上整理出Oracle JDK,Oracle JDK不开源

二者区别:

  • 是否开源:Oracle JDK是不完全开源的,Open JDK是开源的
  • 是否免费:Oracle JDK仅仅3年免费,Open JDK免费
  • 功能性:Oracle JDK相比于Open JDK添加了特有的功能和工具

总结

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

相关文章

  • Java如何分析算法的时间和空间复杂度

    Java如何分析算法的时间和空间复杂度

    这篇文章主要介绍了Java如何分析算法的时间和空间复杂度,在计算机科学中,计算复杂性解释了算法的性能。文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • Java经典排序算法之冒泡排序代码实例

    Java经典排序算法之冒泡排序代码实例

    这篇文章主要介绍了Java经典排序算法之冒泡排序代码实例,相邻两元素进行比较,如过左侧元素大于右侧元素,则进行交换,每完成一次循环就将最大元素排在最后,下一次循环是将其它的数进行类似操作,需要的朋友可以参考下
    2023-11-11
  • SpringCloud实战之Feign声明式服务调用

    SpringCloud实战之Feign声明式服务调用

    这篇文章主要介绍了SpringCloud实战之Feign声明式服务调用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 如何对spring框架的搭建进行封装--springboot

    如何对spring框架的搭建进行封装--springboot

    这篇文章主要介绍了如何对spring框架的搭建进行封装--springboot,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Spring中一个少见的引介增强IntroductionAdvisor

    Spring中一个少见的引介增强IntroductionAdvisor

    这篇文章主要为大家介绍了Spring中一个少见的引介增强IntroductionAdvisor实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 支持生产阻塞的Java线程池

    支持生产阻塞的Java线程池

    在各种并发编程模型中,生产者-消费者模式大概是最常用的了。在实际工作中,对于生产消费的速度,通常需要做一下权衡
    2014-04-04
  • Java IO之File 类详解

    Java IO之File 类详解

    这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Java引用机制之强引用、软引用、弱引用和虚引用的实战指南

    Java引用机制之强引用、软引用、弱引用和虚引用的实战指南

    Java 的引用机制是垃圾回收(GC)体系中极为关键的一部分,不同引用类型代表不同的对象生命周期管理方式,Java 从 JDK 1.2 起提供了四种引用级别强引用、软引用、弱引用和虚引用,本文将逐一讲解它们的特点、内存行为、适用场景,并提供实践示例代码
    2025-12-12
  • mybatis实现获取入参是List和Map的取值

    mybatis实现获取入参是List和Map的取值

    这篇文章主要介绍了mybatis实现获取入参是List和Map的取值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java MethodHandle的使用详解

    Java MethodHandle的使用详解

    这篇文章主要介绍了Java MethodHandle的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论