本文参考资料:
深入理解JAVA虚拟机:JVM高级特性与最佳实践/周志明著
JAVA虚拟机精讲/高翔龙编著
我们这里所提到的JAVA不仅仅代表JAVA这个编程语言,而是一套强大的技术体系平台。
JAVA被分为3种结构独立但又彼此依赖的技术体系分支:Java SE(标准版)、Java EE(企业版)、Java ME(精简版)。以上三种体系分支分别对应着不同的规范集合和组件:Java SE活跃在桌面领域,主要包含Java API组件;Java EE活跃在企业级领域,除了包含Java API组件,还扩充有Web组件、事务组件、分布式组件、EJB组件、消息组件;Java ME则活跃在嵌入式领域,仅保留部分Java API组件以及适应设备的特有组件,这也是它“精简版”称呼的由来。
下面我画张图来整理以上3种技术体系分支:
我们都知道JAVA被广泛认可,但是为什么呢?这是因为JAVA体系有如下不可忽视的优点:
- 拥有一门结构严谨、面向对象的编程语言
- 跨平台(摆脱硬件平台的约束) ----“Write once,Run anywhere”主8要由字节码支持。因为Java源代码默认编译结果为平台通用的字节码。
- 安全性优越 ---提供了一种相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题
- 多线程
- 分布式
- 完善的应用程序接口
- 大量的第三方类库
Java技术体系所包含的内容:
JDK与JRE的关系:
JDK:支持Java程序开发的最小环境。JDK = Java程序设计语言+Java虚拟机+Java API类库。
JRE:支持Java程序运行的标准环境。JRE=Java虚拟机 +Java API类库中的Java SE API子集 。
JAVA发展史
Java体系结构的组成:
- Java编程语言
- 字节码
- Java API
- Java虚拟机
Java重要概念
首先我们理一下一个Java程序从编写到最终执行的结构链路:
首先我们使用Java编程语言编写好Java程序的源代码,然后Java前端编译器负责将源代码编译为字节码,接着Java虚拟机负责将编译好的字节码装载进内部,解释/编译为对应平台上的机器指令运行。
字节码:任何编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及一些其他辅助信息的话,这个编译结果就是一个有效的字节码文件。
字节码的重大作用:为Java跨平台提供了支持。正是因为源代码编译后为字节码文件,而字节码文件相较机器指令,字节码可以解决程序的安全性问题、跨平台移植性问题。而且源码只需一次编译,得到的字节码文件可以在不同的平台上运行。
Java API:是一些预先定义的接口,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又不需要访问源码或者理解内部工作机制的细节。
Java API的重大作用:支持平台无关性和安全性使得Java程序适应任何应用程序。
Java虚拟机:其主要任务为将字节码装载到内部,解释/编译为对应平台上的机器指令执行。
常用的虚拟机:Sun公司的HotSpot。
HotSpot中内嵌有两个JIT编译器:Client Compiler 和 Server Compiler ,我们简称为C1和C2编译器。其内部即时编译器与解释器并存,两者协同工作,既可以保证程序的响应时间,又能提高程序的执行性能,也降低了对编译器工作的负载。缺省情况下到底有多少个字节码指令是通过解释运行还是通过编译运行,这个根据热点探测功能来确定。热点探测功能简单描述为:给频繁调用的方法或者方法体中有循环次数比较多的代码块打上“热点代码”的标记,对于热点代码则直接使用编译器进行编译而不再考虑解释器的解释功能。
开发人员也可以手动规定HotSpot VM 进行完全解释策略 或者完全编译策略。
完全解释策略:编译器停止所有工作,字节码完全靠解释器逐行解释执行。
完全编译策略:编译器进行编译工作,但是当编译器无法进行时,解释器可以介入执行。目的是确保程序能够顺利执行。
最后我们提一下Java的多核并行
在JDK1.5中引入了java.util.concurrent包,实现了一个粗粒度的并发框架。
在JDK1.7中对并发框架进行扩充,引入了java.util.concurrent.forkjoin包。
Frok/Join模式是处理并行编程的一种经典方法。
下面是Fork/Join模式的示意图: