java基础-编译执行和解释执行

硅谷探秘者 2885 0 0

概念:

        解释运行: 一边对程序进行翻译,翻译成计算机可以执行的指令,一边交给计算机执行,翻译一句执行一句。

        编译运行: 对整个程序先翻译成计算机可以理解的指令,然后计算机可以直接执行。

java是解释执行还是编译执行:

        “一次编译、到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK,安装好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境而已,所以才有了Java一次编译,到处运行这样的效果。

        严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java虚拟机和DOS类似,相当于一个供程序运行的平台。

程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java在编译阶段则体现了跨平台的特点。编译过程大概是这样的:首先是将Java源代码转化成.CLASS文件字节码,这是第一次编译。.class文件就是可以到处运行的文件。然后Java字节码会被转化为目标机器代码,这是是由JVM来执行的,即Java的第二次编译。

        “到处运行”的关键和前提就是JVM。因为在第二次编译中JVM起着关键作用。在可以运行Java虚拟机的地方都内含着一个JVM操作系统。从而使JAVA提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。

    Java采用的是解释和编译混合的模式。它首先通过javac将源码编译成字节码文件class.然后在运行的时候通过解释器或者JIT将字节码转换成最终的机器码。

单独使用解释器的缺点:

        抛弃了JIT可能带来的性能优势。如果代码没有被JIT编译的话,再次运行时需要重复解析。

单独使用JIT的缺点:

        需要将全部的代码编译成本地机器码。要花更多的时间,JVM启动会变慢非常多;

        增加可执行代码的长度(字节码比JIT编译后的机器码小很多),这将导致页面调度,从而降低程序的速度。

        有些JIT编译器的优化方式,比如分支预测,如果不进行profiling,往往并不能进行有效优化。

        

        因此,HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。

        JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。

        JIT为方法级,它会缓存编译过的字节码在CodeCache中,而不需要被重复解释。


JVM运行方式不是一成不变,你可以根据场景在虚拟机启动的时候自己制定不同的运行模式

        mixed模式: 用-Xmixed开启,即混合运行模式,也是Hotspot的默认模式

        int模式: 用-Xint开启,即解释模式, 在这种模式下全部采取解释模式运行

        comp模式: 用-Xcomp开启,这种模式下通知JVM关闭解释模式,采用编译模式运行。但往往导致无法得到良好的自动优化


评论区
请写下您的评论...
暂无评论...
猜你喜欢
spring/springmvc 3991 1.springmvc流程图:2.流程分析1.一个url请求该站点的前端控制器DispatcherServlet。2.随后DispatcherServlet调用HandlerMapping
weblog 3629 据库中挑选出符合声明的数据,而不是像传统程思维去指示计算机如何操作。所以最关键的一点是:SQL的语法并不按照语法顺序。sql的语法顺序一般来说sql的语法顺序是: SELECT[DISTINCT]
数据库基础 3021 从数据库中挑选出符合声明的数据,而不是像传统程思维去指示计算机如何操作。所以最关键的一点是:SQL的语法并不按照语法顺序。2.sql的语法顺序一般来说sql的语法顺序是:SELECT[DISTIN
spring/springmvc 4362 springmvc项目启动时controller在springmvc的配置文件中加入controller的bean,注意bean加载的顺序beanclass
java springboot 1726 涉及知识点:java动态java反射,io流,java文件操作,输入输出重定向,多线程与线程安全,mysql数据库设计等,理起来难度较高。下面是我自己设计的几个问题,一些测试数据。排序问题
official 747 《计算机组成原理》运算器的本组成如下运算器的本组成控制器的本组成控制器的本组成完成一条指令的步骤完成一条指令的步骤计算机的工作过程过程描述起来非常复杂,不太好描述,我也是截图贴在了这里(原视
框架 3127 1.浏览器请求浏览器向服务器请求时,服务器不会直接我们的类,而是到web.xml里寻找路径名①:第一步,浏览器输入访问路径后,携带了请求,头,体②:第二步,根据访问路径找到已注册的
weblog 2137 java使用原生jdbc连接数据库获取数据或sql语句(mysql) publicvoidtest2(){ try{ //加载MySql的驱动类 Class.forName
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。