现在让你谈谈对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平台的更多内容,请看后续文章。

“Java是编译执行的语言”这句话对吗?的更多相关文章

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

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

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

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

  3. 实习第二天-java参数传递-精华在文章最后2句话

    对于基本类型的传递,我们很容易理解,而对于对象,总让人感觉是按引用传递,看下面的程序: public class ObjectRef { //基本类型的参数传递 public static void ...

  4. 关于JAVA,特点,历史,编译式的语言&解释式的语言,什么是java?JDK?DOS?一次编译到处运行原理。

    1.java语言的特点: 简单的:面向对象的:跨平台(操作系统)的(一次编译,到处运行):高性能的: 2.类名的首字母大写,方法小写: 3.历史: java2(即java),为什么加个2呢?1998年 ...

  5. java 计算数学表达式及执行脚本语言

    java SE6中对常用的脚本语言做了支持. 可供使用者在java代码中执行脚本语言,还可以利用get("key"),put("key","value ...

  6. 03 sublime text3下配置Java的编译运行环境

    参考如下文章,加入了自己的干货: https://blog.csdn.net/qq_38295511/article/details/81140069 https://blog.csdn.net/qq ...

  7. java入门学习笔记之1(类的定义,代码的编译执行)

    这篇文章讲解Java代码的基本执行过程 我们先抛开各种JAVA IDE,开发工具,只使用文本编辑器,以突出最本质的东西. 在Linux环境下,我们编辑一个文件: vim HelloWorld.java ...

  8. Java解释执行和编译执行

    以前有句话说:“Java是解释执行的 ” .现在看来确实不是很准确,至于原因,在此简略解释: 首先,我们先解释一下在Java中解释执行和编译执行的区别. 解释执行:将编译好的字节码一行一行地翻译为机器 ...

  9. JAVA,Python代码是编译执行还是解释执行?

    转载地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641 有人在讨论 Python 代码是编译执行还是解释执行?这 ...

随机推荐

  1. BZOJ3022 : [Balkan2012]The Best Teams

    将选手和询问按照年龄排序,即可去掉年龄的限制. 将所有选手按水平排序后维护线段树,显然最优解一定是从大到小贪心选择. 线段树上每个节点维护: $g[0/1]:r+1$不选/选的时候,$l$选不选. $ ...

  2. 开车旅行 [NOIP 2012]

    Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 i ...

  3. JS 之 script标签

    1.script标签 1.js代码的解析(包括下载js文件)会阻塞页面加载 2.当js文件放在头部,页面必须等所有js代码都被下载,解析和执行完成后才开始呈现页面内容(遇到body标签才呈现),对于那 ...

  4. echarts相关的可视化数据

    echarts使用步骤: 1)设置一个容器,该容器用来放图形,一定要给容器设置高度: 2)初始化echarts实例,语法:var  aa =  echarts.init(DOM); 例如: echar ...

  5. 获取html下的所有纯文本的方法

    第一种是看别人博客的,第二种是自己发现的. 第一种: #-*- coding: utf8 -*- import re html = """ <div class=& ...

  6. 小甲鱼Python第十四课后习题

    字符串格式化符号含义    符   号    说     明      %c    格式化字符及其ASCII码[>>> '%c' %97        'a']      %s    ...

  7. django的templatetags

    创建tag方式,首先在需要使用tag的app下创建一个templatetags的python包, 然后在包里创建一个tag模块,例如hellotag.py from django import tem ...

  8. 【搜索】传感器 @upcexam6023

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 SR最近新买了一款电子桌游 这个玩具内部是M个围成一圈的传感器.每个传感器都有开和关两种工作状态,分别用1和0表示.显然,从不同的位置触发沿 ...

  9. Android Studio3.0.1集成Git

    1:前提 本机可以根据SSH的方式正常连接git服务器 2:开始配置 file-settings-Version Control 点击右边的+号天添加项目所在目录,VCS类型选择Git 点击 Conf ...

  10. linux apache2部署php

    apache2 doc http://blog.csdn.net/actor1999/article/details/44802519 #apache sudo apt-get install apa ...