【深入理解JVM-走进Java】

出来工作了几个月后,发现对java高阶知识了解的还是不够深,没毕业就买了一本<深入理解java虚拟机>到现在也就粗略看了也就两三章。于是决定通过做笔记的方式再次学习下。梳理下知识体系,了解下深入知识。

一、java技术体系

1、官方定义

Sun官方定义的java技术体系包括:
1、java 语言
2、各个硬件平台的java虚拟机
3、Class文件的格式
4、Java API类库
5、商业机构和第三方的java类库

2、技术体系的划分方式

java技术体系两种划分方式:

  • 按照各个组分的功能划分
  • 按照技术服务领域划分
3、功能上划分

(1)组分的部分功能

jdk:(java development kit) java开发工具包
jre:(Java Runtime Environment)java运行环境。
jvm:(java virtual machine ) java虚拟机

(2)之间具体关系图(如下)

在这里插入图片描述

1、可以看出jdk包含jre。
2、jre包含jvm

4、技术服务领域划分

也就是按照java技术关注的重点业务领域划分:

1、java Card 支持一些java程序(Applets)运行在小内存设备(如智能卡)上面的平台。
2、java ME(Micro Edition)支持java程序运行在移动终端上的平台,对java api有所精简,并加入了针对移动终端的支持这个版本以前称为J2ME。
3、java SE(Standard Edition)支持面向桌面级应用(如window下的应用程序)的java平台,提供完整java 核心api,这个版本以前称为J2SE。
4、jaca EE
(Enterprise Edition) 支持使用多层架构的企业应用,(如ERP,CRM 应用)的平台,除了提供javase的api外还对其进行了大量的扩充,并提供了相关的部署支持,这个版本以前称为J2EE。

二、java的发展史

1、由来

(1)创始人

扫描二维码关注公众号,回复: 12026783 查看本文章

我们java的祖师爷:James Gosling(詹姆斯高斯林)。
java 前身:Oak(橡树),1995-5-23改名为java ,正式发布java1.0版本。

2、jdk的历史版本

这里主要总结下对应版本出现的重要技术等…

  • 1996-1-23 jdk1.0:提供了纯解释型虚拟机(Sun Classic vm),代表技术,java虚拟机,Applets Awt等。(提出口号一次编译、多出运行)

  • 1997-2-19 jdk1.1:提供了java技术的最基础支持代表技术JDBC,JavaBeans,RMI。java语法也得到了发展如出现了内部类,反射

  • 1998-12-4 jdk1.2:Sun 在这个版本中吧java技术拆分为三个方向:J2SE,J2ME,J2EE。这个版本出现了很多技术,如EJB,java Plug-in,java IDL,Swing。 这个版本的中虚拟机中内置了JIT(just in time)编译器。添加了strictfp关键字以及Collections集合工具类

  • 1999-4-27 HotSpot虚拟机发布(发布时作为jdk1.2的附加程序提供),HotSpot虚拟机成为jdk1.3版本及之后所有版本的默认虚拟机。

  • 2000-5-8 jdk1.3:1.3版本相对1.2版本的改进主要表现在一些类库上(如数学运算好新的Timer API 等),JNID服务从jdk1.3开始作为一项平台级服务提供(以前jnid仅仅是一项扩展),使用CORBA IIOP来实现RMI的通信协议,等等。还提拱了大量的新的java 2D API ,添加了javaSound 类库。

  • 2002-2-13 jdk1.4发布,1.4版本是java真正走向成熟的一个版本,很多有名的公司都有参与,甚至独立实现了自己的jdk1.4,直到现在,主流的框架(Spring, Hibernate,Struts)都能直接运行在jdk1.4或者1.4之上版本运行。1.4的一些新特性:正则表达式,异常链,NIO,日之类,XML解析器和XLST转换器等

  • 2004-9-30 jdk1.5发布 ,1.2版本到1.5版本语法层面上的变换很小,而jdk1.5在语法易用性上面做了非常大的改进,例如自动装箱,泛型,动态注解,枚举可变参数,遍历循环(foreach)等语法都是1.5加入的。提供了java.util.concurrent并发包。(1.5版本之后不再支持windows 9x)

  • 2006-12-11 jdk1.6版本,Sun终结了从jdk1.2 版本开始已经有八年的J2SE,j2EE,J2ME,的命名方式。启用J2SE6,j2EE6,J2ME6的命名方式。jdk1.6的新特性:提供动态语言支持(通过内置的Mozilla javaScript Rhino引擎实现),提供编译api 和微型的Http服务器等APi。同时这个版本针对虚拟机内部做了大量的改进,包括锁与同步,垃圾收集,类加载等方面的算法都有相当多的改动。

  • 2006 年11月13日的javaOne大会上Sun公司宣布将java开源,同时建立了Openjdk组织对这些源码进行独立的管理,除了及其少量的产权代码外,Openjdk 几乎包含了SunJdk的全部代码,在jdk1.7中Sunjdk和OpenJdk除了代码文件头的版权注释之外,代码基本上完全一样。所以Openjdk7和SunJdk7本质上就是同一套代码库开发的产品。

  • 2009-2-19 1.7的功能规划完成,由于各种原因之后Sun被Oracle收购,直到2011-7-28发布了oracle发布1.7版本,1.7的特性:提供了新的G1收集器,加强对非java语言的调用支持,升级类加载架构等。

  • 2009-4-20 Oracle公司宣布以74亿美元价格收购Sun公司。

  • 最新的java SE 7 Update9与2012年10月16日发布,从java SE 7 Update4开始oracle 开始支持Mac OS X操作系统,并在Update6中达到完全支持的程度,同时Update6中还对ARM指令集架构提供了支持,至此官方提供的jdk可以运行于Windows(不含windows 9 X)Linux,Solaris,Mac OS平台上,支持ARM,X86, X64和Sparc指令集架构类型。

  • 2014-jdk8:出现了Lambda表达式函数式接口接口的默认方法和静态方法、Streams、Date/Time API(JSR 310)、Base64(对Base64编码的支持已经被加入到Java 8官方库中,这样不需要使用第三方库就可以进行Base64编码)

目前java已经更新到13但是企业使用最多的还是java8,这里就先总结到8。。。

三、jvm发展史

1、 Sun Classic / Exact VM

Sun Classic
世界上第一款商用 Java 虚拟机;只能使用纯解释器方式来执行 Java 代码,也可以使用外挂JIT编译器,JIT 会完全接管虚拟机的执行系统,但是此时解释器不会再工作了;JDK1.2之前是 Sun JDK 中唯一的虚拟机,JDK1.4 时,完全退出商用虚拟机的历史舞台,与 Exact VM 一起进入了Sun Labs Research VM。

Exact VM
它的执行系统已经具备了现代高性能虚拟机的雏形:如两级即时编译器、编译器与解析器混合工作模式等;
使用准确式内存管理:虚拟机可以知道内存中某个位置的数据具体是什么类型。
有与 HotSpot 几乎一样的热点探测;
在商业应用上只存在了很短暂的时间就被更优秀的 HotSpot VM 所取代。

2 、Sun HotSpot VM

它是 Sun JDK 和 OpenJDK 中所带的虚拟机,也是目前使用范围最广的 Java 虚拟机;
继承了 Sun 之前两款商用虚拟机的优点(如准确式内存管理),也使用了许多自己新的技术优势,如热点代码探测技术(通过执行计数器找出最具有编译价值的代码,然后通知 JIT 编译器以方法为单位进行编译);如果一个方法被频繁调用或者方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。让编译器和解释器恰当的协同工作。可以在最优化的程序响应时间与最佳执行性能中取得平衡。而且无需等待本地代码输出才能执行程序,及时编译的时间压力相对减少。

Oracle 公司分别收购了 BEA 和 Sun,并在 JDK8 的时候,整合了 JRokit VM 和 HotSpot VM,如使用了 JRokit 的垃圾回收器与 MissionControl 服务,使用了 HotSpot 的 JIT 编译器与混合的运行时系统

3 、Sun Mobile-Embedded VM / Meta-Circular VM

sun 公司不仅出了面向桌面、服务器领域的虚拟机还出了其他领域的虚拟机如下:

KVM:
在 Android、IOS 等智能手机操作系统出现前,曾在手机平台上得到非常广泛的应用。

CDC / CLDC HotSpot Implementation:整个Java ME 的重要支柱,但是在 Android 和 IOS 二分天下的移动数字设备市场看来,其面临的局面不容乐观。

Squawk VM:运行于 Sun SPOT(一种手持的WiFi设备),也曾运用于 Java Card,是一个 Java 代码比重很高的嵌入式虚拟机实现。

JavaInJava:一个实验室性质的虚拟机,试图以 Java 语言来实现 Java 语言本身的运行环境。它必须运行在另外一个宿主虚拟机之上,内部没有 JIT 编译器,代码只能以解释模式执行。

Maxine VM:与 JavaInJava 非常相似,它有着先进的 JIT 编译器和垃圾收集器(但没有解析器),可在宿主模式或独立模式下执行,其执行效率已经接近了 HotSpot Client VM 的水平。

4 、BEA JRockit / IBM J9 VM(非sun公司出的虚拟机)

BEA公司JRockit VM:
号称“世界上速度最快的 Java 虚拟机”(广告词);一款专门为服务器硬件和服务器端应用场景高度优化的虚拟机,由于专注于服务器端应用,可以不太关注程序启动速度,因此 JRockit 内部不包含解释器实现,全部代码靠即时编译器编译后执行,除此之外,JRockit 的垃圾收集器和 MissionControl 服务套件等部分的实现,在众多 Java 虚拟机中也一直处于领先水平。

IBM J9 VM:
市场定位与 Sun HotSpot 比较接近,是一款设计上从服务器端到桌面应用再到嵌入式都全面考虑的多用途虚拟机;
其开发的目的:作为 IBM 公司各种 Java 产品的执行平台。

5 Azul VM / BEA Liquid VM

我们平时所说的“高性能 Java 虚拟机”一般是指 HotSpot、JRockit、J9 这类在通用平台上运行的商用虚拟机,但其实 Azul VM 和 BEA Liquid VM 这类特定硬件平台专有的虚拟机才是“高性能”的武器。

Azul VM
在 HotSpot 基础上进行大量改进,运行于 Azul Systems 公司的专有硬件 Vega 系统上的 Java 虚拟机,每个 Azul VM 实例都可以管理至少数十个 CPU 和数百 GB 内存的硬件资源,并提供在巨大范文内实现可控的 GC 时间的垃圾收集器、为专有硬件优化的线程调度等优秀特性;

Liquid VM:
即是现在的 JRockit VE(Virtual Edition),是 BEA 公司开发的,可以直接运行在自家的 Hypervisor 系统上的 Jrockit VM 的虚拟化版本。它不需要操作系统的支持,或者说它自己本身实现了一个专有操作系统的必要功能,如文件系统、网络支持等。由虚拟机越过通用操作系统直接控制硬件可以获得很多好处,如在线程调度时,不需要再进行核态/用户态的切换等,这样可以最大限度的发挥硬件的能力,提升 Java 程序的执行性能。

6 、Apache Harmony / Google Android Dalvik VM

它们只能称为“虚拟机”,而不能称为“Java 虚拟机”。

Apache Harmony:是一个 Apache 软件基金会旗下以 Apache License 协议开源的实际兼容于 JDK1.5 和 JDK1.6 的 Java 程序运行平台。包含自己的虚拟机和java库。但是没有通过TCK认证(若果一个公司宣布兼容java语言那必须通过这个认证)虽然Apache Harmony没有经过TCK认证但是他的许多代码(基本上是java库部分的代码)被吸纳IBM的JDK7实现以及google android sdk中,尤其对安卓的发展起到重要作用.

Dalvik VM
1、是 Android 平台的核心组成部分之一。
2、名字由来冰岛的小渔村名。
3、没有遵循 Java 虚拟机规范,不能直接执行 Java 的 Class 文件,使用的是寄存器架构而不是 JVM 中常见的栈架构。
4、它执行的 dex(Dalvik Executable)文件可以通过 Class 文件转化而来。
5、android2.2提供即时编译器,直行性能大大提高。

7 、Microsoft JVM 及其他

除了上面大量被商业使用的jvm外还有些不为人知或者曾经绚丽最终湮灭的jvm。

Microsoft JVM
微软公司曾经是java技术的铁杆支持者。java语言诞生的初期(jdk1.2为界),他的主要应用就是在浏览器的运行java Applets程序。微软公司为了在 IE3 中支持 Java Applets 应用而开发了自己的 Java 虚拟机,虽然这款虚拟机只有 Windows 平台的版本,却是当时 Windows 下性能最好的 Java 虚拟机。但是好景不长,1997年sun控告微软侵犯商标、不正当竞争最终微软赔了10亿美元给sun。

其他的jvm
JamVM、cacaovm、SableVM、Kaffe、Jelatine JVM、Nano VM、MRP、Moxie JVM、Jikes RVM。

四、展望java技术未来

1、模块化

解决应用系统与技术平台之间越来复杂、越来庞大问题的重要途径。

2、混合多语言

1、单一的java开发无法满足当前软件的复杂需求时,越来越多的基于java虚拟机的语言开发被应用到项目中。java平台上多语言混合正成为主流、最终这些语言运行在同一个虚拟机上。
2、近年来运行在java虚拟机上的语言在迅速增长,一些新的语言还有老语言也出现了基于java虚拟机的实现版本(如下图片来源网络)

在这里插入图片描述

3、多核并行

1、如今CPU硬件发展方向:从高频率向多核心发展
2、随着多核时代的来临软件开发越来越关注并行编程的领域。jdk1.5添加了并发包,而在1.7中并发包中又添加forkjoin包。进一次对并发包扩充。Fork/Join模式是处理并发编程的一个经典方法。这个模式虽然不能解决所有的问题但是在此模式适用的范围内能轻松利用多个cpu核心提供的计算资源来写作完成一个复杂的任务。
3、java8添加了lambda,函数式编程的重要优点就是程序天然的适合并行运行
4、目前显卡的算术运算能力并行能力已经远超cpu。在图形领域以外发掘显卡的潜力是近几年计算机发展的方向之一。例如c语言的CUDA、OpenJdk的子项目Sumatra。Sumatra项目就是为java提供使用GPU(Graphics Processing Units)和APU(Accelerated Processing Units)运算工具,以后将会提供直接java层的api或者为Lambda或者其他语言直接提供底层并行运算支持。
4、在jdk范围外也出现了为满足并行计算而出现的框架如Apache的Hadoop、Map Reduce。这是简单易懂的并行框架,能够运行在由成千上万个商用机器组成的大型集群上。以可靠容错方式并行处理TB级别数据。另外还出现了例如Scala、Clojure、Erlang天然具有并行计算能力的语言

4、64位虚拟机的支持

1、jvm在操作系统推出64位系统后,也添加64为的虚拟机支持。但是前期效果不是很好,在64位上虚拟机消耗内存同等下比32位增加了10%-30%、运行速度也落后32位。但是javaEE方面好多企业都使用超4G的内存对于64位的虚拟机需求迫切。由于以上原因,许多企业仍然选择虚拟集群的等方式继续在32位的虚拟机中进行部署。
2、未来64位的虚拟机也在逐渐完善

5、源码编译

参看<深入理解jvm虚拟机>课本

The End

发现对java的认识又加深了不少。。。。。。

猜你喜欢

转载自blog.csdn.net/qq_38350635/article/details/101926382