如今让你谈谈对Java平台的理解,你是否会感受内容过于庞大?这个问题是比较宽泛的,Java发展到如今已经不单单是语言这么简单了,Java平台涉及的,包括但不只限于下面提到的这些内容:java
这些内容没法在一个篇幅中都提到。本文从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不要进行解释执行,这种模式也叫作“最大优化级别”,但实际上也并不必定会高效。oop
总的来讲,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平台的更多内容,请看后续文章。操作系统