Java SE,Java EE & Java ME?
有没有想过,同样是Java,会不会存在不同的版本 or anything else?事实上,为了使软件开发人员、服务提供商和设备生产商可以针对特定的市场进行开发,SUN公司将Java划分为三个技术平台:
- Java SE:Standard Edition(标准版)
- Java EE:Enterprise Edition(商业版)
- Java ME:Micro Edition(小型版)
Java SE
全称为Java Platform Standard Edition,这是Java 平台标准版,包含标准的 JVM和标准库,更具体地说,包括了 Java 核心的类库,如集合、IO、数据库连接以及网络编程等。
JavaSE 是Java 编程语言的基础,三个核心平台中的核心部分,Java EE 和 Java ME 都是从 JavaSE的基础上发展而来的
JavaSE是为开发普通桌面和商务应用程序提供的解决方案。
Java EE
全称是 Java Platform Enterprise Edition,Java 平台企业版,建立在 Java SE 的基础上,并加入了大量的 API 和库,包含了支持企业级应用程序开发和部署的标准和规范(比如 Servlet、JSP、EJB、JDBC、JPA、JTA、JavaMail、JMS)。
Java EE是进一步学习Web应用所必须的,Spring等框架都是Java EE开源生态系统的一部分。
JavaEE 是为开发企业级应用程序提供的解决方案。
Java ME
全称是 Java Platform Micro Edition,Java平台小型版,是一个针对 嵌入式设备 的 “瘦身版”,要用于小型数字电子设备上软件程序的开发,例如家用电器的智能化、联网功能等。
此外,JavaME提供了HTTP等高级Internet协议,使移动电话能以Client/ Server方式直接访问 Internet的全部信息,提供最效率的无线交流。
JavaME 是为开发电子消费产品和嵌入式设备提供的解决方案。然而Java ME从来没有真正流行起来,反而是Android开发成为了移动平台的标准之一,只需要了解即可。
JDK,JVM & JRE?
Java文档官网:docs.oracle.com/en/java/ind…
立即推(张宇老师口吻):这题我会!事实上,这个问题倒是比较容易理解。
详细信息可参考:官方架构图。
JVM & JIT
JVM 即 Java 虚拟机,是运⾏ Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),⽬的是使⽤相同的字节码,它们都会给出相同的结果。
在 Java 中,JVM 可以理解的代码就叫做 字节码 (即扩展名为 .class 的⽂件),它不⾯向任何特定的处理器,只⾯向虚拟机。Java 语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏效率低的问题,同时⼜保留了解释型语⾔可移植的特点。所以 Java 程序运⾏时⽐较⾼效
⽽且,由于字节码并不针对⼀种特定的机器,因此,Java 程序⽆须重新编译便可在多种不同操作系统的计算机上运⾏。
Java 程序从源代码到编译运⾏⼀般需要经历以下的过程:
事实上,可以运行在 Java 虚拟机上的语言除了 Java外还有很多,如Groovy(.groovy)、Kotlin(.kt)、JRuby(.rb)、Clojure(.clj)等,它们编译运行的过程大致相似,经过对应的编译器编译为 .class字节码文件。
这里需要格外注意的是 .class --> 机器码 这⼀步。在这⼀步 JVM 类加载器⾸先加载字节码⽂件,然后通过 解释器 逐⾏解释执⾏,这种⽅式的执⾏速度会相对⽐较慢。⽽且,有些⽅法和代码块是经常需要被调⽤的(也就是所谓的热点代码),所以后⾯引进了 JIT (Just in Time Compilation)编译器,⽽ JIT 属于运⾏时编译。当 JIT 编译器完成第⼀次编译后,其会将字节码对应的机器码保存下来,下次可以直接使⽤。⽽我们知道,机器码的运⾏效率肯定是⾼于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。
于是引入 JIT 后,程序从源代码到编译运⾏经历的过程具体为:
JDK & JRE
JDK 是 Java Development Kit,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
JRE 是 Java 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序。
如果只是为了运⾏⼀下 Java 程序的话,只需要安装 JRE 就可以了。如果需要进⾏⼀些Java 编程⽅⾯的⼯作,那么就需要安装 JDK 了。
这也不是绝对的。有时,即使不打算在计算机上进⾏任何 Java 开发,仍然需要安装 JDK。例如,如果要使⽤ JSP 部署 Web 应⽤程序,那么从技术上讲,只是在应⽤程序服务器中运⾏ Java 程序。
但是因为应⽤程序服务器会将 JSP 转换为 Java servlet,并且需要使⽤ JDK 来编译 servlet,还是需要安装JDK
编译与解释并存?
参考JVM部分,可知 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行。
AOT & JIT?
可参考:理解Java的JIT和AOT,JIT v.s. AOT in Java。
JIT是Just-In-Time的首字母缩写,指程序运行期间发生的编译行为。
- JIT多伴随解释器,因为解释型语言是按行解释执行,JIT将“常用”功能编译为机器码,需要时直接执行,减少解释时间;
- 例如:Python(pypy),新版Javascript、Ruby、Php解释器;
AOT是Ahead-Of-Time的首字母缩写,指程序运行之前发生的编译行为。
- 对于编译型语言,AOT啥也不是,本身就是先编译后执行,但对于解释型语言,AOT提前“预见”热点功能,并编译为机器码,同样减少解释时间;
- 例如:C,C++,Rust,Go,Java AOT;
AOP是JDK 9 引入了一种新的编译模式,主要优势在于启动时间、内存占用和打包体积。JIT 的主要优势在于具备更高的极限处理能力,可以降低请求的最大延迟。