现在让你谈谈对Java平台的理解,你是否会感觉内容过于庞大?这个问题是比较宽泛的,Java发展到现在已经不仅仅是语言这么简单了,Java平台涉及的,包括但不仅限于下面提到的这些内容:

  • Java语言本身,包括基础的语言特性,面向对象、放射、范型、lambda等等。
  • Java类库,包括核心类库如IO/NIO、网络、utils、安全、jdk等,以及在生产环境中常用的第三方类库。
  • Java虚拟机,包括java的内存管理机制、垃圾收集器、运行时、动态编译等
  • Java/JVM生态,包括了Java EE、Spring、Hadoop、Spark等等
  • Java工具,包括用来诊断性能如jmap、jstack等、编译器javac、sjavac、以及辅助工具如jlink、jar等。

这些内容无法在一个篇幅中都提到。本文从Java等基本特性开始,先来回答一个问题“Java是编译执行语言,这句话对吗?”,我们又该如何理解Java的“书写一次 ,到处执行”呢?

Java语言本身最显著的两大特性是“书写一次,到处运行(Write Once,run anywhere)“,以及垃圾收集。这两点都和C++有明显的区别。

”书写一次,到处运行“的能力是基于Java 虚拟机(JVM)的。Java源代码编译后生成的.class文件并不是最终的机器码,而是一种可以被JVM解析的格式,称为字节码。JVM将字节码翻译成机器码后执行机器码来运行程序。只要在不同的操作系统上安装好JVM后,.class文件便可以在这些JVM上运行。

从这个过程来看,字节码是在JVM中被解释执行的,那么“Java是解释执行的语言”这句话正确吗?这句话不太准确,常见的JVM,比如我们最经常使用的Oracle JDK提供的JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的即时编译(https://en.wikipedia.org/wiki/Just-in-time_compilation)。为了提高热点代码的执行效率,在运行时,JVM会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,这种情况下,热点代码就属于“编译执行”而不是解释执行。JVM提供了不同的参数来对这两种模式进行指定,例如-Xint告诉JVM只进行解释执行,不对代码进行编译,这种模式就抛弃了JIT带来的性能上的优化。同时另一个参数-Xcomp则是告诉JVM不要进行解释执行,这种模式也叫做“最大优化级别”,但实际上也并不一定会高效。

总的来说,Java的“编译”和C/C++的编译含义是不同的。Java源代码编译后生成的.class文件中是字节码,而不是可以直接运行的机器码。JVM通过类加载器(class-loader)来加载字节码,进行解释执行或编译执行。除了上面说到的这两种编译模式外,还有一种编译模式称为AOT(Ahead-of-Time Compilation)(https://en.wikipedia.org/wiki/Ahead-of-time_compilation),AOT可以将字节码直接编译成机器码,在JDK 9中便引入了这些特性。更多的细节可以参考文档http://openjdk.java.net/jeps/295。

JVM本身是一个强大的平台,它除了使得Java源代码编译生成的字节码具备”书写一次,到处运行“的能力外,只要符合格式的字节码,都可以运行在JVM上,所以大量的JVM语言的字节码都可以在JVM上运行,例如Scala。

关于Java平台的更多内容,请看后续文章。

转载于:https://www.cnblogs.com/QG-whz/p/10386635.html

“Java是编译执行的语言”这句话对吗?相关推荐

  1. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  2. java 编译 解释执行_关于Java的编译执行与解释执行

    编程语言分为低级语言和高级语言,机器语言.汇编语言是低级语言,C.C++.java.python等是高级语言. 机器语言是最底层的语言,能够直接执行.而我们编写的源代码是人类语言, 计算机只能识别某些 ...

  3. java源程序编译型_Java语言的源程序不是编译型的,而是编译解释型的。( )_学小易找答案...

    [单选题]下列选项中,不属于Java语言特点的一项是( ). [单选题]贺铸<半死桐>(重过阊门万事非)悼念其妻病逝于: [判断题]Java语言具有较好的安全性和可移植性及与平台无关等特性 ...

  4. Java动态编译执行

    在某些情况下,我们需要动态生成java代码,通过动态编译,然后执行代码.JAVA API提供了相应的工具(JavaCompiler)来实现动态编译.下面我们通过一个简单的例子介绍,如何通过JavaCo ...

  5. java源程序编译型_Java语言的源程序不是编译型的,而是编译解释型的。

    Java语言的源程序不是编译型的,而是编译解释型的. 语言译解2情绪状态的种类有(). 程序感冒期间忌食以下哪些食物 区分团花剪纸的方法,不编译主要看单独纹样重复出现的情况的说法正确吗?( ) 编释型 ...

  6. java源程序编译型_Java语言的源程序不是编译型的,而是编译解释型的

    各项下列,语言译解破伤症状不属的是驱期风前. 程序后无户的的账结账期末余额是(. 不编译周期期主延长要采用的营销有(产品成熟策略生命.各项中不下列"病"痒因的属于是.脉弦细数,耳鸣 ...

  7. java编译执行与解释执行混合_编译执行与解释执行的区别

    解释执行 由解释器根据输入的数据当场执行而不生成任何目标程序. 解释执行程序是高级语言翻译程序的一种,它将源语言(如VASIC)书写的源程序作为输入,解释一句后就提交给计算机执行一句,并不生成目标程序 ...

  8. sublime java 编译_03 sublime text3下配置Java的编译运行环境

    需求 由于不想在ide里面进行Java的学习,所以想用sublime进行Java的开发,于是就有了如何在sublime里面进行对Java的编译运行的问题. 深度需求 最近在练习多语言同时实现数据结构和 ...

  9. 会java c php三种语言_php java net三种语言的区别

    php java net是现在比较流的三种编程语言. 如果学的时候,该学哪种语言呢? PHP:PHP产生与1994年,其语法混合了C.Java.Perl 和他自创的一些编程语法:PHP是嵌入在HTML ...

最新文章

  1. iOS开发--Mac下server搭建
  2. python实战系列之写个好玩的猜拳游戏(附源代码)
  3. HDU2199,HDU2899,HDU1969,HDU2141--(简单二分)
  4. win8.1适合哪个版本的linux,紧跟Win8 全面体验最适合国人的深度Linux
  5. 开发者社区精选直播合集一览
  6. windows服务编程 注册InstallUtil.exe
  7. Datawhale组队-pandas(上)基础(自学)
  8. Python文本词频统计
  9. Chrome浏览器 js 关闭窗口失效解决方法
  10. 重磅消息,Redis开源作者宣布不再维护Redis项目!
  11. 《UnityAPI.MovieTexture影片纹理》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+MovieTexture+audioClip+立钻哥哥++OK++)
  12. 皮线光缆和预制成端皮线光缆招标采购技术标准
  13. ai面试的优缺点_AI面试是什么?有哪些特点呢?
  14. r730 raid5 linux 驱动,DELL R720安装REDHAT5.1 RAID驱动问题
  15. 异常解决——Failed to introspect Class [com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration]
  16. font awesome矢量字体使用
  17. 基于JAVA大连环保公益网计算机毕业设计源码+系统+lw文档+部署
  18. svn使用过程中遇到的错误
  19. 小程序--获取手机型号
  20. python语言的实验心得体会范文_心得体会 心得体会范文 实验心得体会四篇

热门文章

  1. PyQt5 技术篇-设置窗口置顶不生效问题原因,setWindowFlags()设置参数后不生效解决办法
  2. STM32 GPIO与 EXTI的映射关系
  3. [YTU]_2922(Shape系列-8)
  4. Remove Duplicates from Sorted ListII
  5. 12v小型电机型号大全_电机型号参数大全,再不怕看不懂型号了!建议收藏
  6. Mysql data type
  7. Android NDK环境搭建
  8. 网络验证常见的攻击方式与防御手段
  9. Java读写二进制数据
  10. run as gradle test,未执行@Test中的内容(待解决)