文章目录
- Java 概述
- 1.什么是Java
- 2. JDK1.5 之后的三大版本
- 3. Jdk和Jre和JVM的区别
- 4. 什么是跨平台性?原理是什么
- 5. Java 语言有哪些特点?
- 6. 什么是字节码?采用字节码的最大好处是什么
- 7. 为什么不全部使用 AOT(since JDK9) 呢?
- 8. 为什么说 Java 语言“编译与解释并存”?
- 9. Oracle JDK vs OpenJDK
Java 概述
1.什么是Java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C+里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
2. JDK1.5 之后的三大版本
- Java SE (J2SE,Java 2 Platform Standard Edition,标准版):Java SE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。Java SE包含了支持Java Web服务开发的类,并为JavaEE和Java ME提供基础.
- Java EE (J2EE,Java 2 Platform Enterprise Edition,企业版):Java EE以前称为J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java应用程序。Java EE是在Java SE的基础上构建的,它提供Web服务、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和Web2.0应用程序。2018年2月,Eclipse宣布正式将JavaEE更名为JakartaEE。
- Java ME (J2ME,Java 2 Platform Micro Edition,微型版):Java ME以前称为J2ME。Java ME为在移动设备和嵌入式设备(比如手机、PDA、电视机打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于JavaME规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
3. Jdk和Jre和JVM的区别
4. 什么是跨平台性?原理是什么
- 所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。
- 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。
5. Java 语言有哪些特点?
- 简单易学;
- 面向对象(封装,继承,多态);
- 平台无关性( Java 虚拟机实现平台无关性);
- 支持多线程( C++ 11开始(2011年的时候),C++才引入了多线程库);
- 可靠性;
- 安全性;
- 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
- 编译与解释并存;
6. 什么是字节码?采用字节码的最大好处是什么
字节码: Java源代码经过javac编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。
采用字节码的好处: Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以java程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
我们需要格外注意的是 .class->机器码
这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT(just-in-time compilation) 编译器
,而 JIT 属于运行时编译
。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存
的语言 。
HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。
7. 为什么不全部使用 AOT(since JDK9) 呢?
AOT 可以提前编译节省启动时间,那为什么不全部使用这种编译方式呢?
长话短说,这和 Java 语言的动态特性有千丝万缕的联系了。举个例子,CGLIB 动态代理使用的是 ASM 技术,而这种技术大致原理是运行时直接在内存中生成并加载修改后的字节码文件也就是 .class 文件,如果全部使用 AOT 提前编译,也就不能使用 ASM 技术了。为了支持类似的动态特性,所以选择使用 JIT 即时编译器。
AOT是Ahead-of-Time
的缩写,是一种编译方式。在AOT编译中,程序代码在运行之前被编译成本地机器代码,而不是在运行时通过解释器逐行解释执行。这种编译方式可以提高程序的执行效率和性能,因为编译后的本地代码可以更快地执行。
AOT编译在JDK中是从JDK 9版本开始引入的。JDK 9引入了一个新的工具,称为jaotc,用于将Java应用程序编译为本地代码。此外,JDK 9还引入了一个实验性的特性,称为AOT编译器,它允许在Java应用程序启动时使用AOT编译器生成本地代码。
随后的JDK版本也继续改进了AOT编译的性能和可用性。例如,JDK 10增加了对Windows和Linux x64平台的AOT编译支持,JDK 11中提供了对macOS和Linux AArch64平台的AOT编译支持。在JDK 16中,AOT编译被认为是正式的功能,并且被视为JVM生态系统的一部分。
8. 为什么说 Java 语言“编译与解释并存”?
我们可以将高级编程语言按照程序的执行方式分为两种:
- 编译型 :编译型语言 会通过编译器将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
- 解释型 :解释型语言会通过解释器一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
为了改善编译语言的效率而发展出的即时编译技术,已经缩小了这两种语言间的差距。这种技术混合了编译语言与解释型语言的优点,它像编译语言一样,先把程序源代码编译成字节码。到执行期时,再将字节码直译,之后执行。Java与LLVM是这种技术的代表产物。
相关阅读: Java 即时编译器原理解析及实践
为什么说 Java 语言“编译与解释并存”?
这是因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行。
9. Oracle JDK vs OpenJDK
原文连接:https://javaguide.cn/java/basis/java-basic-questions-01.html#oracle-jdk-vs-openjdk