JVM系列--趣谈Java历史发展的故事

简介: JVM系列--趣谈Java历史发展的故事

java技术体系的一些发展故事


你好我是idea。本专栏我们来一起聊聊关于java虚拟机家族发展的故事内容,本文可能不会讲解过多关于技术原理相关的内容,更多的相关知识点会比较有趣味些。


在1990年的时候,有几个技术宅开始在研究一种能够支持跨平台的系统。


\

为什么C语言不具备有较好的跨平台特性?


使用C语言编辑出来的文件最终是二进制格式的,但是不同的cpu对于这些二进制识别的规则不一致,这就容易导致C语言写出来的东西在A-cpu上边可以运行,但是在B-cpu中不能运行,所以说C语言在跨平台方面做的不够完善。


网络异常,图片无法展示
|


这几个技术宅于是在原先C语言的基础上边进行了二次开发,打算结合不同的cpu对于指令集解析的规则做一层适配器(虚拟机的概念逐渐诞生),于是便开发了一种叫做Oak的语言。但是由于Oak语言当时已经被别人注册了,所以改名为了Java语言。


JDK发展历史


1996年初的时候,Java语言首次登台亮相,这个时候主要是由Sun公司在推广,并且取名为JDK1.0版本,采用的主要是一款叫做Classic的虚拟机技术。但是由于Classic虚拟机技术的一些缺陷,在编辑层面做得不够完善,也给初期用户留下了一个”Java语言非常缓慢“的印象。


1997年的时候,sun公司收购了一家叫做Longview Technologies的公司,此时渐渐出现了一款叫做Hotspot的虚拟机。


网络异常,图片无法展示
|


1998年的时候,jdk1.2发布了,主要针对方向是大型服务器系统,同时Sun公司也提出了jsp/Servlet技术规范,EJB规范,并且将Java的整体领域划分为了J2EE,J2SE,J2ME三个方向,开始了对于市场上面各类软件开发商,服务提供商的市场竞争。此时也出现了一款叫做Exact Vm的虚拟机,这款虚拟机的性能要比原先使用的Classic虚拟机技术更加成熟一些。Exact Vm虚拟机主要是废弃了早期使用的句柄查询对象技术,提升了对象定位的性能。


网络异常,图片无法展示
|


2000年的时候,JDK1.3发布了,Hotspot虚拟机成了默认虚拟机,而之前在JDK1.2时期出现的Exact VM却因为一些内部决策原因没有继续开发和维护下去了。Hotspot虚拟机也就从此成为了大多数程序员所使用的一款虚拟机技术。


2001年,JDK1.4发布,Classic虚拟机退出了人们的视线中。后边在03年的时候,Groovy也加入到了Java的阵营中。04年的时候JDK1.5的出现可谓是一次里程碑式的改动,在这个版本中出现了较多的变动,例如泛型,反射,枚举,可变长参数,foreach语法等等新的特色要点涌现出来。


后来在06年的时候,Java开始对外开源,也就形成了一个著名的OpenJDK项目,在这个项目里面Hotspot虚拟机的名声又一次被放大了。


虽然说JDK的这些年发展一直都很顺畅,但是商业的竞争是残酷的,随着Sun公司的发展,另一巨头Oracle开始渐渐眼红了,计划采用收购手段来获取这些有价值的技术。 08年的时候Oracle公司将BEA给进行了收购,当时BEA公司也有在研发自己独有的虚拟机,并且开发了一款叫做JRokit的虚拟机技术。后边Oracle又把Sun公司给进行了收购,于是便同时拥有了JRokit和Hotspot两款非常有名气的虚拟机技术。


2011年的时候,jdk1.7发布了,此时推出了新一代的垃圾回收器G1,以及NIO2.0技术的发布。后续再2014年的时候,JDK1.8也开始出现在大众的视野中,当时的lambda语法大大改变了java的编程风格和习惯。


随着后续jdk的不断发展和迭代,又衍生出来了几项新的技术:


JDK9—默认采用了G1作为垃圾收集器,同时引入了Jshell 这款技术工具。



JDK10—在这个版本中引入了var关键字的使用,以及线程的本地握手技术(可以理解为当某个线程执行完毕之后,自动回调相关的新方法)



JDK11—开始将HttpClient 的api引入到了java.net包当中使用。ZGC技术的推广,ZGC可以理解为是对原先的G1的一种优化手段。与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的STW。



JDK12—引入了一种叫做Shenandoah 的GC技术,这款技术通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200 MB 还是 200 GB,都将具有相同的暂停时间。

\

有哪些公司开发过JDK


除了我们熟系的Sun,Oracle之外,其实还有以下公司开发过自己专属的JDK。

IBM公司开发过一款叫做J9的虚拟机,在业界其实也是有一定名气的。


bea system公司开发过jrockit虚拟机,在文章的上方我也有提及过,不过这家公司后续被Oracle收购了。


另外我们熟知的阿里巴巴,推特都有尝试做过专属于自己的jdk定制,不过它们都是在基于Hotspot的基础技术上边做一些改造,并没有重头开始进行开发。open jdk,

sun/oracle jdk,j9,jrockit虚拟机都是可以在通用的硬件平台上边运行。还有一类jdk比较特别,适用于专门的硬件平台运作,Azul Systems公司的azul vm就是一个案例,不过是基于hotspot进行改造的。由于之前的azul vm 虚拟机对于硬件的适配要求过高,所以后期Azul Systems公司并没有着重发展这一块的业务,而是改成了投入精力去发展zulu产品。其实zulu的jvm要比hotspot虚拟机的性能表现更好,同时修改了hotspot内部的许多实现细节,其中的pgc,c4垃圾收集器能够支持到TB级别的垃圾回收。这一点hostspot要到了jdk11和jdk12版本才能赶上其性能提升。


微软也有过研发jdk的背景,不过后来被sun公司起诉了于是停止了研发。


2018年的时候oracle labs就公开表明在研究一款黑科技 graal vm,这一款虚拟机能够同时支持多类不同的语言进行相互调用。


只不过说Sun/Oracle开发的hotspot虚拟机使用比较广泛,所以容易造成程序员的一些认识误解,以为JDK只有Hotspot这一款系列。

目录
相关文章
|
11天前
|
存储 Java
深入理解Java虚拟机:JVM内存模型
【4月更文挑战第30天】本文将详细解析Java虚拟机(JVM)的内存模型,包括堆、栈、方法区等部分,并探讨它们在Java程序运行过程中的作用。通过对JVM内存模型的深入理解,可以帮助我们更好地编写高效的Java代码,避免内存溢出等问题。
|
2天前
|
Java 索引
深入浅出JVM(五)之Java中方法调用
深入浅出JVM(五)之Java中方法调用
|
3天前
|
Java 编译器 对象存储
java一分钟之Java入门:认识JDK与JVM
【5月更文挑战第7天】本文介绍了Java编程的基础——JDK和JVM。JDK是包含编译器、运行时环境、类库等的开发工具包,而JVM是Java平台的核心,负责执行字节码并实现跨平台运行。常见问题包括版本不匹配、环境变量配置错误、内存溢出和线程死锁。解决办法包括选择合适JDK版本、正确配置环境变量、调整JVM内存参数和避免线程死锁。通过代码示例展示了JVM内存管理和基本Java程序结构,帮助初学者更好地理解JDK和JVM在Java编程中的作用。
16 0
|
3天前
|
存储 监控 安全
JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、Java虚拟机栈等内容。
|
5天前
|
存储 缓存 安全
【 Java中String源码分析(JVM视角你不来看看?】
【 Java中String源码分析(JVM视角你不来看看?】
10 0
|
11天前
|
存储 机器学习/深度学习 Java
【Java探索之旅】数组使用 初探JVM内存布局
【Java探索之旅】数组使用 初探JVM内存布局
25 0
|
11天前
|
小程序 Java 程序员
【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系
【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系
27 0
|
17天前
|
Java
[JVM] Java类的加载过程
[JVM] Java类的加载过程
[JVM] Java类的加载过程
|
17天前
|
存储 缓存 Java
[JVM] 浅谈JMM(Java 内存模型)
[JVM] 浅谈JMM(Java 内存模型)
|
17天前
|
缓存 监控 Java
Java从入门到精通:3.3.1性能优化与调优——学习Java的性能优化技巧,如JVM调优
Java从入门到精通:3.3.1性能优化与调优——学习Java的性能优化技巧,如JVM调优