现在让你谈谈对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. HashMap源码分析和应用实例的介绍

    1.HashMap介绍 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.S ...

  2. redis 作为 mysql的缓存

    使用redis做为MySQL的缓存   介绍 在实际项目中,MySQL数据库服务器有时会位于另外一台主机,需要通过网络来访问数据库:即使应用程序与MySQL数据库在同一个主机中,访问MySQL也涉及到 ...

  3. Ubuntu或linux 运行后台进程运行不挂断的办法

    nohup python ChatReq.py 20000 >>log_cronjob.txt 2>&1 & 之前把nohup去掉,发现就算运行python Chat ...

  4. 解决本地文件上传时fakepath的问题

    $("input[type='file']").on('change', function () { var oFReader = new FileReader(); var fi ...

  5. MySQL中的isnull、ifnull和nullif函数用法

    isnull(expr) 如expr为null,那么isnull()的返回值为1,否则返回值为0. mysql>select isnull(1+1); ->0 mysql>selec ...

  6. JAVA中使用Log4j2日志和Lombok引入日志的方法

    一.简述 我们项目中既要使用lombok,又要使用log4j2时,使用日志将会更简单. 二.解决 1.引入依赖 <dependency> <groupId>org.apache ...

  7. 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=i5j7gwrxj9x5

    我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=i5j7gwrxj9x5

  8. k8s应用首页临时改成升级维护页面

    在本地虚拟机 产生一个nginx配置文件 [root@centos-01 dockerfile]# cat weifeng_maintain.conf server { listen 443; ser ...

  9. 安全系列之CSRF初探

    前言 安全对于互联网的从业技术人员来讲,一直是接触或者实际使用掌握比较薄弱的一块,当然对于那些专项搞安全类的技术人员来讲除外. 接下来就来聊聊在互联网领域中常用的一些安全漏洞类型和一些防范手段,当然针 ...

  10. JAVA中Integer的==和equals注意

    “equals”比较:equals(Object obj)方法,在equals(Object obj)方法中,会先判断参数中的对象obj是否是Integer类型的对象,如果是则判断值是否相同,值相同则 ...