专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

Java界大名鼎鼎的HotSpot虚拟机的演进之路

ins518 2024-10-31 14:36:26 技术文章 18 ℃ 0 评论

HotSpot发展历程

提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。

这个Java界大名鼎鼎的虚拟机最初并非由Sun公司开发,而是由一家名为Longview Technologies的小公司设计的,后来Sun公司注意到了这款虚拟机,在1997年收购了Longview Technologies公司,从而获得了HotSpot VM。

在2006年,Sun公司宣布最终会把Java开源,并在此基础上建立了OpenJDK。这样HotSpot VM便成为了Sun JDK和OpenJDK两个极其接近的JDK项目的共同虚拟机。

HotSpot VM只是Java虚拟机的一种实现,不是世界上唯一的虚拟机。JRocket VM是BEA公司的JVM,一般和J2EE应用服务器Weblogic配合使用。另外J9 VM是IBM的JVM,一般和IBM的J2EE应用服务器Websphere配合使用,2017年,IBM也开源了J9,捐献给了Eclipse基金会,命名为Eclipse OpenJ9。

在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款Java虚拟机:JRockit VM和HotSpot VM。 目前Oracle公司在推进这两款虚拟机的整合工作,使之优势互补。

国内平时用得比较多的Java版本一般是OpenJDK,Oracle/Sun JDK里面的HotSpot VM只有非常少量的功能没有在OpenJDK里,且这些部分都不涉及JVM的核心功能。

Hot Spot的内存区域演进

前文《Java面试必考问题:Java堆内存管理机制 》中介绍了HotSpot VM的堆内存结构,提到了HotSpot VM有一个称作“永久代”的内存区域,这个只有HotSpot才有,BEA JRocket和IBM J9都不存在永久代(Permanent Generation)的概念。

HotSpot的永久代主要是为了实现JVM中的方法区(Method Area)的功能,存放类型信息、域信息、方法信息、JIT代码缓存、静态变量以及运行时常量池。JDK1.6及以前的版本,这些数据都是保存在HotSpot VM的永久代。

到了JDK1.7版本,HotSpot VM还有永久代,不过开始逐步去永久代,将字符串常量池、静态变量移除,保存在堆中。

到了JDK1.8及以后,HotSpot VM没有永久代了,取而代之的是元空间(Metaspace)类型信息、字段、方法、常量保存在元空间,字符串常量池、静态变量还是保存在堆里。

永久代被元空间取代的原因主要是:永久代空间大小很难确定,太小容易OOM异常,太大占用太多虚拟机内存。另外永久代调优困难,垃圾回收频率低。元空间并不在虚拟机中,而是使用本地内存,大小仅受本地内存限制。

我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,欢迎大家关注,谢谢。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表