主题:  JAVA是解释执行还是编译执行?

我的答案 : 混合模式

闲谈 :

1. JAVA(write once,run anywhere);

2. GC(Garbagae Collection),Java通过垃圾收集器回收分配内存,大部分情况下,程序猿不需要自己操心内存的分配和回收。

3. JRE,也就是java运行环境,包含了JVM和JAVA类库,以及一些模块等。而JDK可以看做是JRE的一个超集,提供了更多工具,比如编译器、

  各种诊断工具等。

步入主题:

  对于“Java是解释执行”这句话,这个说法不太准确。  我们看流程, 我们开发的JAVA源代码,首先通过Javac编译成为字节码(bytecode),然后,在运行时,通过

JAVA虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。(但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-

Time)编译器,也就是通过所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行了,而不是解释执行了。)

  这里,我们来研究2点,从上面的话可以看出,基本上比较普遍的情况就是解释执行,但是JIT有时也能出现,这就是避免了主要重复的业务代码暂居大部分开销的情况。

第二个点是:什么是 编译执行,解释执行。

  编译型语言:在程序运行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序时,就不用再进行翻译了。

  解释型语言:是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。

   SO,二者之间最大的区别就在于是否存下目标机器码:编译会把输入的源程序以某种单位(例如基本块/函数/方法/trace等)翻译生成目标机器码,并存下来(无论是在磁盘上或是内存中)后续执行可以复用;解释则是把源程序中的指令逐条解释执行,边解释边执行,不存下目标代码,后续执行没有可以复用的信息。

了解Java的运行过程:Java源文件(*.java),通过java编译器(javac)编译生成一个ByteCode字节码文件(*.class),字节码由java自己设计的一个计算机(即java虚拟机,JVM)解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的目标机器码,然后在特定的机器上运行。

所以说Java的解释器的优点是比较容易让用户实现自己跨平台的代码,同一套代码可以在几乎所有的操作系统上执行。

(这里提一下java的跨平台Write Once,Run Anywhere:java的跨平台是基于JVM的。JVM是在一台计算机上由软件或是硬件模拟的计算机,java程序所有的*.class文件都是在JVM上运行的,也就是说*.class文件只需认JVM,由JVM去适应各个操作系统,所以不同的操作系统只要安装符合其类型的JVM,那么程序无论到哪个OS上都是可以正确执行的JVM for Unix / JVM for Windows / JVM for Other……,因此没有JVM也就不能跨平台)

  

虽然Java的第一道工序是javac编译,其目标文件是ByteCode,而并非机器语言,但后续可能有三种处理方式:

1、运行时,ByteCode由JVM逐条送给解释器,解释器将翻译成机器码运行。

2、运行时,部分ByteCode可能由实时编译器(Just In Time Compiler,JIT)编译为目标机器码再执行(以method为翻译单位,还会保存起来,第二次执行就不用再翻译为机器码了),因为考虑到有些JVM是采用纯JIT编译方式实现的,其内部没有解释器,例如:JRockit、Maxine VM。

3、RTSJ,继javac之后执行AOT二次编译,生成静态的目标平台码。

有的时候,可能是以上三种方式同时在使用,至少,1和2是同时使用的,3则需要程序员手工指定。

补充 :

1. JDK 8 实际上是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通过运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,

  client模式这个门限是1500次。oracle HotSpot JVM 内置了2个不同的JIT compiler,C1对应前面说的client模式,适用于对于启动速度敏感的应用,比如java桌面应用。

C2对应server模式,他的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。

2. Java虚拟机启动是,可以指定不同的参数对运行模式进行选择。比如,指定“-Xint”,就是告诉JVM只进行解释执行,不对代码进行编译,这种模式抛弃了JIT可能带来的

  性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。与其对应的,还有一个“-Xcomp”参数,这就是告诉JVM关闭解释器,不要进行解释执行,或者叫做

  最大优化级别。(但是这种模式并不意味着最高效)。xcomp会导致JVM启动变慢非常多,同时有些JIT编译器优化方式,比如分支预测,如果不进行profiling,

  往往并不能进行有效优化。

3. AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码。这样就避免了JIT预热等各方面的开销,比如Oacle JDK 9 就引入了实验性的AOT特性,并且增加了

  新的 jaotc 工具。利用下面的命令把某个类或者某个模块编译成为AOT库。

jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base

然后,在启动时直接指定就可以了。

java -XX:AOTLibarary=./libHelloWorld.so,./libjava.base.so HelloWorld

而且, oracle jdk 支持分层编译和AOT协作使用,这2者并不是二选一的关系。可参考: http://openjdk.java.net/jeps/295

4. 同时,类似JVM这种跨平台特性,就像JAVA当中“解耦”这种艺术手法一样,在Scale,Groovy,Jruby等语言上,也得到了体现。

JAVA平台的理解的更多相关文章

  1. 谈谈你对 Java 平台的理解

    声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...

  2. 《Java核心技术36讲》阅读笔记:谈谈对Java平台的理解笔记

    1. 谈谈你对Java平台的理解. Java是一种面向对象的语言,最显著的特性有两个方面: 一个就是一次编译,到处运行(Write once, run anywhere),能够非常容易的获得跨平台能力 ...

  3. Java-谈谈对Java平台的理解

    问题 谈谈对 Java 平台的理解 Java是解释执行的 这句话对么 程序的编译与解释有什么区别 Java 平台的了解 Java的主要特点是两个, 编写一次到处运行 Write once, run a ...

  4. 2018.7.26 进程和线程的区别 &&你对 Java平台的理解

    进程和线程的区别 1.定义 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更 ...

  5. java面试题(杨晓峰)---第一讲谈谈你对java平台的理解

    本人总结: 面向对象(封装,继承,多态) 平台无关性(jvm运行,class文件) 语言(泛型,lambda) 类库(集合,并发,网络,io/nio) jre(java运行环境,JVM,类库) JDK ...

  6. 1.谈谈对Java平台的理解

    1.谈谈你对Java平台的理解 Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“一次编译,到处运行”(Compile once,run anywhere),能够非常容易地获取跨 ...

  7. 谈谈你对java平台的理解?

    问题:谈谈你对java平台的理解?java是解释执行,这句话对吗? 典型回答:java本身是一种面向对象的语言,具有很好的跨平台的能力,能够做到“write once ,run anywhere”.另 ...

  8. Java核心-01 谈谈你对Java平台的理解

    今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗? 典型回答 Java本身是一种面向对象的语言,最显著的特性有两个.一是所谓的“书写一次,到处运行”,能够非 ...

  9. 谈谈对Java平台的理解

    从我第一次接触Java的时候,老师就说"Write once,run anywhere",这句话虽然听起来有一点太过于形式主义,但是也突出了它的特点.那么,现在的我们应该总结一下和 ...

  10. 对Java平台的理解

    1)  Java是一种面向对象的语言(封装,继承,多态),最显著的特性有两个方面: ----书写一次,到处运行(Write once,run anywhere) 能够非常容易的获得跨平台的能力 --- ...

随机推荐

  1. POJ 2750 Potted Flower(线段树+dp)

    题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就 ...

  2. CentOS笔记-磁盘管理

    Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分区 df [-ahikHTm] [目录或文件名] -a : ...

  3. mongo-java-driver

    http://mvnrepository.com/artifact/org.mongodb/mongo-java-driver/3.5.0 <!-- https://mvnrepository. ...

  4. 使用POCO发送HTTP(S)请求

    POCO GitHub地址https://github.com/pocoproject/poco http_example.cpp #include <iostream> #include ...

  5. 新产品为了效果,做的比較炫,用了非常多的图片和JS,所曾经端的性能是非常大的问题,分篇记录前端性能优化的一些小经验。

    第一篇:HTTPserver 因tomcat处理静态资源的速度比較慢,所以首先想到的就是把全部静态资源(JS,CSS,image,swf) 提到单独的server,用更加高速的HTTPserver,这 ...

  6. PHP获取类名及所有函数名

    PHP获取当前类名.方法名  __CLASS__ 获取当前类名  __FUNCTION__ 当前函数名(confirm)  __METHOD__ 当前方法名 (bankcard::confirm) _ ...

  7. FZU1977 Pandora adventure —— 插头DP

    题目链接:https://vjudge.net/problem/FZU-1977  Problem 1977 Pandora adventure Accept: 597    Submit: 2199 ...

  8. HDU3746 Cyclic Nacklace —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    M ...

  9. PLSQL 安装说明

    PLSQL安装说明. 1.安装oracle 11g ,2030端口设置防火墙例外.2.PLSQL Developer 9.0.0.1601是绿色版,复制到本地即可.3.PLSQL->Tools- ...

  10. YTU 2442: C++习题 矩阵求和--重载运算符

    2442: C++习题 矩阵求和--重载运算符 时间限制: 1 Sec  内存限制: 128 MB 提交: 1457  解决: 565 题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运 ...