博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java基础】Java到底是解释运行还是编译运行?
阅读量:5886 次
发布时间:2019-06-19

本文共 1199 字,大约阅读时间需要 3 分钟。

本文基于 JDK1.8 版本。

正文

Java语言有两个最为显著的特性,一个是所谓的“书写一次,到处运行”,另外一个是自动垃圾收集功能。前者通过将java程序编译成标准字节码而后通过JVM转为对应平台的机器码来屏蔽底层差异实现此特性。后者通过Java垃圾收集(Garbage Collector)回收分配内存使得开发人员不需要操心内存的分配和回收。今天我们来探讨一下“书写一次,到处运行”的运行是解释运行还是编译运行,要回答此问题首先我们要清楚解释执行和编译执行的概念。

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

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

上面是比较官方的说法,我们可以举个例子,好比去饭店吃饭,解释运行就是上一个菜吃一个,如果菜没来得及做好,你就得等着。编译运行就是提前订好了菜,等到了饭店直接所有菜都端上来一起吃。我们知道了编译运行和解释运行。下面我们来看看我们的Java代码编译步骤(mixed模式下)。

  1. Java代码经过javac编译成class文件(字节码)

  2. class(字节码)文件经过JVM编译成机器码进行解释执行(解释执行)

    1. 对于热点代码,JIT(JustInTime)编译器会在运行时将其编译为机器码执行(编译运行)

从上面我们可以看出,在JVM默认的mixed模式下JAVA既不完全是解释运行也不完全是编译运行。

扩展

  1. Oracle Hotspot JVM 是我们从Oracle下载的JDK中默认使用的JVM。

  2. Oracle Hotspot JVM 中有两个JIT compiler 一个是C1,对应的模式是client, 一个是C2,对应的模式是server。

  3. server和client模式的使用场景是什么, 我举个简单的例子client一般在我们进行开发的时候使用,server模式一般在生产环境使用,如果还想具体了解可以进一步搜索。

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

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

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

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

  5. 在JDK9中提供了实验特性AOT(Ahead-of-Time Compilation)编译器允许将代码编译成机器码交给JVM运行

  6. 对比起JavaScript和python来说,java其实不算纯粹的解释型语言。这部分可以详细参考知乎:Java解释执行时为什么不直接执行源码(https://www.zhihu.com/question/34345694)

转载地址:http://yhmix.baihongyu.com/

你可能感兴趣的文章
数据驱动销售——个性化推荐引擎
查看>>
C语言标准库函数qsort那点小事
查看>>
HL7 CDA高级培训
查看>>
Android 调用照相机拍照
查看>>
linux的C获取shell执行返回的结果
查看>>
关于spring mybateis 定义resultType="java.util.HashMap"
查看>>
程序员怎么留住健康?
查看>>
(转)C# 把我所积累的类库全部分享给博友(附件已经上传)
查看>>
Silverlight5 无法切换输入法,无法输入中文的原因及解决初探
查看>>
游戏开发基础:方向键的组合,八方向实现
查看>>
黑书-DP-方块消除 ****
查看>>
MySQL 分区
查看>>
我的架构经验系列文章 - 后端架构 - 语言层面
查看>>
DEFERRED_SEGMENT_CREATION
查看>>
读取手机硬件信息
查看>>
一致哈希
查看>>
The connection to adb is down, and a severe error has occured. 问题解决
查看>>
在Jenkins中配置运行远程shell命令
查看>>
代码杂记
查看>>
linux中防CC攻击两种实现方法(转)
查看>>