深入理解JVM01-走近Java

第一章的内容大致翻阅了一下感觉还是挺多的,大致都是关于Java的特点、发展史、Java未来的走向以及阅读OpenJDK源码的指导。对于第一章的内容我也准备做一些总结,以备以后的扩充和温故。

Java的特性和优点

提升了开发效率

  • 结构严谨,面向对象
  • 摆脱硬件束缚,“一次编写,到处运行”
  • 相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题(内存回收机制)
  • 热点代码检测和运行时编译及优化,运行次数越多性能越好
  • 完善的应用程序接口(第三方类库)

Java的技术体系

Sun公司所定义的Java技术体系包括以下几个组成部分:

  1. Jav程序设计语言
  2. 各种硬件平台上的Java虚拟机
  3. Class文件格式(面向对象的载体)
  4. Java API库(Java自带可调用的库)
  5. 来自商业机构和开源社区的第三方Java类库(封装好的库)

JDK(Java Development Kit):1+2+4,也就是支持Java开发的最小环境。
JRE(Java Runtime Environment):JavaSE(Java Standard Edition)的API+虚拟机。

Java技术体系模块图:

Java技术体系模块图

按照技术服务领域划分,Java技术体系可以分为4个平台:

  • JavaCard:支持一些Java小程序运行在小内存设备上的平台,如智能卡
  • JavaME(Micro Edition):支持Java运行在移动终端上的平台,对JavaAPI有所精简,并加入了针对移动端的支持
  • JavaSE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API。
  • JavaEE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,对JavaSE API做了大量的扩充并提供相关的部署支持

入门版(Card)👉阉割版(ME)👉标配(SE)👉Pro(EE)

Java发展史

  • 1991年,提出绿色项目(猜想可能是针对c/c++中的垃圾回收,内存处理之类的问题而提出的一个更友好的语言概念);
  • 创立oak(java语言的前身,为了解决家用电器的通信问题而诞生,没有理想市场,不久后将要失败);设计出硬件原型;同时设计出注释器。
  • 1992年,更名为java; Star-Seven Prototype(七星原型,度娘上查了好久没找到,有机会去翻墙再查吧。 猜想可能是当时那个版本的七大基本规范吧。。。先记下来);
  • 1993年,TV Set-top Box ( 可能是在电视机顶盒 试用吧);发布应用开发平台。。
  • 1994年,LiveOak(可能是oak发展有一些起色的意思吧。英语不好真的很忧伤。);发布Era浏览器;继而发布HotJava浏览器;设计出java编译器;
  • 1995年,正式注册java,并相继获得Netscape,Oracle,Microsoft的支持,HotJava进一步发展。
  • 1996年,java1.0发布。
  • 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
  • 1997年,java1.1发布。
  • 1997年9月,JavaDeveloperConnection社区成员超过十万 。
  • 1998年2月,JDK1.1被下载超过2,000,000次
  • 1998年,java1.2发布。
  • 1998年12月8日,JAVA2企业平台J2EE发布。
  • 1999年6月,SUN公司发布Java的三个版本:标准版、企业版和微型版(J2SE、J2EE、J2ME)
  • 2000年,java1.3发布。
  • 2002年,java1.4发布,自此Java的计算能力有了大幅提升。
  • 2004年,java5.0发布,J2SE1.5发布,是Java语言的发展史上的又一里程碑事件。为了表示这个版本的重要性,J2SE1.5更名为J2SE5.0
  • 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名以取消其中的数字“2”:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME。
  • 2006年,java6.0发布,并半开源。
  • 2010年,Oracle收购Sun公司,苹果不再支持java
  • 2011年,java7.0发布。
  • 2014年,java8.0发布。

Java虚拟机发展史

  • Sun Classic/Exact VM(初代):世界上第一款商用Java虚拟机,Sun公司研发,主要特点:慢。
  • Sun HotSpot VM(新技术):目前使用范围最广的虚拟机,是Sun从一家名为Longview Technologies公司收购来的。主要特点:热点探测技术。
  • Sun Mobile-Embedded VM/Meta-Circular VM(探索):面对移动嵌入式市场的探索
  • BEA JRockit /IBM J9 VM(其它公司):当时号称”世界上最快的Java虚拟机”
  • Azul VM/BEA Liquid VM(特定硬件):高性能Java的武器,特定硬件可以最大限度地发挥硬件的能力,提升Java程序的执行能力。
  • Apache Harmony/Google Android Dalvik VM(高速发展):安卓虚拟机。是Android平台的核心组成部分之一。
  • Microsoft JVM(彩蛋):2333

Java的未来

  1. 模块化:说起来也就是解除功能模块和功能模块之间的耦合,降低系统维护消耗。(书上也没仔细说,大家看着标题脑补一下也就知道是干嘛的)
  2. 混合语言:对系统来说是好事(因为不同语言有不同语言的特点 也就是擅长的地方),但是对于Java程序员的要求也会因此而提高。
  3. 多核并行:顺应发展
  4. 丰富语法:更新JDK版本
  5. 64位虚拟机:现在64位虚拟机速度没有32位快,主要是Java EE对64位虚拟机的要求比较急迫。

自己编译JDK

想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛会高一点,但肯定会比阅读各种书籍、文章更加贴近本质。另外,JDK中很多底层方法都是本地化的,需要跟踪这些方法的运作或对JDK进行Hack的时候,都需要自己编译一套JDK。

OpenJDK源码结构图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
├─agent                            Serviceability Agent的客户端实现 
├─make 用来build出HotSpot的各种配置文件
├─src HotSpot VM的源代码
│ ├─cpu CPU相关代码(汇编器、模板解释器、ad文件、部分runtime函数在这里实现)
│ ├─os 操作系相关代码
│ ├─os_cpu 操作系统+CPU的组合相关的代码
│ └─share 平台无关的共通代码
│ ├─tools 工具
│ │ ├─hsdis 反汇编插件
│ │ ├─IdealGraphVisualizer 将server编译器的中间代码可视化的工具
│ │ ├─launcher 启动程序“Java”
│ │ ├─LogCompilation 将-XX:+LogCompilation输出的日志(hotspot.log)整理成更容易阅读的格式的工具
│ │ └─ProjectCreator 生成Visual Studio的project文件的工具
│ └─vm HotSpot VM的核心代码
│ ├─adlc 平台描述文件(上面的cpu或os_cpu里的*.ad文件)的编译器
│ ├─asm 汇编器接口
│ ├─c1 client编译器(又称“C1”)
│ ├─ci 动态编译器的公共服务/从动态编译器到VM的接口
│ ├─classfile 类文件的处理(包括类加载和系统符号表等)
│ ├─code 动态生成的代码的管理
│ ├─compiler 从VM调用动态编译器的接口
│ ├─gc_implementation GC的实现
│ │ ├─concurrentMarkSweep Concurrent Mark Sweep GC的实现
│ │ ├─g1 Garbage-First GC的实现(不使用老的分代式GC框架)
│ │ ├─parallelScavenge ParallelScavenge GC的实现(server VM默认,不使用老的分代式GC框架)
│ │ ├─parNew ParNew GC的实现
│ │ └─shared GC的共通实现
│ ├─gc_interface GC的接口
│ ├─interpreter 解释器,包括“模板解释器”(官方版在用)和“C++解释器”(官方版不在用)
│ ├─libadt 一些抽象数据结构
│ ├─memory 内存管理相关(老的分代式GC框架也在这里)
│ ├─oops HotSpot VM的对象系统的实现
│ ├─opto server编译器(又称“C2”或“Opto”)
│ ├─prims HotSpot VM的对外接口,包括部分标准库的native部分和JVMTI实现
│ ├─runtime 运行时支持库(包括线程管理、编译器调度、锁、反射等)
│ ├─services 主要是用来支持JMX之类的管理功能的接口
│ ├─shark 基于LLVM的JIT编译器(官方版里没有使用)
│ └─utilities 一些基本的工具类
└─test 单元测试
0%