Java HotSpot™虚拟机实现(Java HotSpot™VM)是Sun Microsystems,Inc.的高性能Java平台虚拟机。Java HotSpot技术为Java SE平台提供了基础,Java SE平台是快速开发和部署业务关键型桌面和企业应用程序的首选解决方案。Java SE技术可用于Solaris操作环境(OE),Linux和Microsoft Windows,以及通过Java技术许可证的其他平台。
Java平台已经成为软件开发和部署的主流。拥有数百万开发人员和用户,Java平台在许多方面正在蓬勃发展,从信用卡到无线设备,台式机到大型机。它是部署网页小程序,Web服务,大型商业应用程序等的基础。
Java HotSpot VM基于Java技术的跨平台支持和强大的安全模型,具有可扩展性,质量和性能的新功能和功能。除了新功能,此版本向上兼容以前的版本。
Java HotSpot VM几乎支持企业应用程序的开发,部署和管理的所有方面,并被以下各项所使用:
Sun Microsystems,Inc.也通过使用各种行业标准和内部开发的基准来推动性能提升。这些改进适用于客户端和服务器端Java VM环境。
Java标准版平台包含Java VM的两个实现:
Java HotSpot VM建立在强大的功能和功能基础之上。支持动态面向对象优化的体系架构可以实现世界一流的绩效。即使是目前最大的计算机系统,整个虚拟机中的多线程支持也能提供高可扩展性。高可靠性,可用性和可维护性(RAS)功能提供企业级可靠性,同时实现快速开发,内省和管理。
Java HotSpot虚拟机是Sun的用于Java平台的虚拟机。它使用许多先进技术为Java应用程序提供最佳性能,并结合了最先进的内存模型,垃圾收集器和自适应优化器。它是用高级的,面向对象的风格写的,其特点是:
JDK包括VM的两种风格 - 客户端产品,以及针对服务器应用程序调整的VM。这两个解决方案共享Java HotSpot运行时环境代码库,但使用不同的编译器来适应客户端和服务器的独特性能特征。这些差异包括编译内联策略和堆默认值。
JDK在发行版中包含这两个系统,所以开发人员可以通过指定-client
或 选择他们想要的系统 -server
。
虽然服务器和客户端虚拟机类似,服务器虚拟机已经被特别调整,以最大化最高运行速度。它旨在执行长时间运行的服务器应用程序,它们需要尽可能快的运行速度,而不仅仅是快速启动时间或更短的运行时内存占用。
客户端VM编译器作为旧版本JDK使用的经典虚拟机和即时(JIT)编译器的升级。客户端虚拟机为应用程序和小程序提供更好的运行时性能。Java HotSpot客户端虚拟机已经过专门的调整,以减少应用程序启动时间和内存占用,使其特别适合客户端环境。一般来说,客户端系统更适合GUI。
客户端VM编译器不会尝试执行服务器VM中编译器执行的许多更复杂的优化,但作为交换,分析和编译一段代码所需的时间较少。这意味着客户机VM可以启动更快,并且需要更小的内存占用。
服务器VM包含一个高级自适应编译器,它支持通过优化C ++编译器执行的许多相同类型的优化,以及传统编译器无法完成的一些优化,例如跨虚拟方法调用的积极内联。与静态编译器相比,这是一个竞争优势和性能优势。自适应优化技术在其方法上非常灵活,并且通常优于甚至先进的静态分析和编译技术。
这两种解决方案都能提供极其可靠,安全和可维护的环境,以满足当今企业客户的需求。
在Java虚拟机的先前版本(如Classic VM)中,间接句柄用于表示对象引用。虽然这样可以使垃圾回收过程中的重定位对象更容易,但它代表了一个重大的性能瓶颈,因为对Java编程语言对象的实例变量的访问需要两级间接。
在Java HotSpot VM中,Java代码不使用任何句柄。对象引用被实现为直接指针。这提供了C速度访问实例变量。在内存回收期间重新定位对象时,垃圾收集器负责查找和更新对该对象的所有引用。
Java HotSpot VM使用两个机器对象标题,而不是Classic VM中的三个字。由于平均Java对象大小很小,这对空间消耗有重大影响 - 为典型应用程序节约了大约8%的堆大小。第一标题字包含诸如身份哈希代码和GC状态信息的信息。第二个是对象的类的引用。只有数组具有第三个标题字段,用于数组大小。
类,方法和其他内部反射数据直接表示为堆上的对象(尽管这些对象可能无法直接通过基于Java技术的程序访问)。这不仅简化了VM内部对象模型,而且还允许通过与其他Java编程语言对象相同的垃圾收集器收集类。
每线程方法激活堆栈使用主机操作系统的堆栈和线程模型进行表示。Java编程语言方法和本地方法共享相同的堆栈,允许C和Java编程语言之间的快速调用。使用主机操作系统的线程调度机制支持完全抢占的Java编程语言线程。
使用本地OS线程和调度的主要优点是能够透明地利用本机OS多处理支持。由于Java HotSpot VM被设计为在执行Java编程语言代码时对由抢占和/或多处理引起的竞争条件不敏感,所以Java编程语言线程将自动利用本机OS提供的任何调度和处理器分配策略。
Java HotSpot VM的内存系统的代际性提供了灵活性,可以使用适合多种应用程序需求的特定垃圾收集算法。Java HotSpot VM支持几种不同的垃圾收集算法,旨在提供不同的暂停时间和吞吐量要求。
程序员的Java编程语言的主要吸引力是它是提供内置自动内存管理或垃圾回收(GC)的首选主流编程语言。在传统语言中,使用显式分配/自由模型分配动态内存。在实践中,这不仅是传统语言编写的程序中的内存泄漏,程序错误和崩溃的主要原因,而且也是一个性能瓶颈,也是模块化可重用代码的主要障碍。(确定模块边界之间的自由点几乎是不可能的,没有明确和难以理解的模块之间的合作。)在Java编程语言中,垃圾收集也是支持安全模型所需的“安全”执行语义的重要组成部分。
垃圾收集器会自动处理 释放被回收的对象,只有当它能够证明的对象不再是正在运行的程序访问的幕后未使用的对象内存。这个过程的自动化完全消除了由于释放太少而导致的内存泄漏,而且还释放了由于释放太多导致的程序崩溃和难以查找的引用错误。
传统上,垃圾收集被认为是一个低效率的过程,相对于一个无明确的模型,阻碍了性能。实际上,随着现代垃圾收集技术的发展,性能得到了很大改善,整体性能实际上远远优于明确释放对象所提供的性能。
除了包括下面描述的最先进的功能之外,内存系统被设计为一个干净的面向对象的框架,可以轻松地进行测试,实验或扩展到使用新的垃圾收集算法。
Java HotSpot垃圾收集器的主要功能如下。总的来说,这些功能非常适合需要尽可能高的性能的应用程序,并且对于长时间运行的应用程序,由于分段而导致内存泄漏和内存无法访问的应用程序是非常不希望的。
Java HotSpot垃圾收集器是一个完全准确的收集器。相比之下,许多其他垃圾收集器是保守的或部分准确的。虽然保守的垃圾收集可能是有吸引力的,因为它很容易添加到没有垃圾回收支持的系统中,但它有一些缺点。一般来说,保守的垃圾回收器容易发生内存泄漏,不允许对象迁移,并可能导致堆碎片。
保守的收藏者不知道所有对象引用所在的位置。因此,通过假设似乎引用对象的记忆词实际上是对象引用,它必须是保守的。这意味着它可以产生某些类型的错误,比如混淆一个对象指针的整数。看起来像一个指针的内存单元格被认为是一个指针 - 而GC变得不准确。这有几个负面影响。首先,当出现这种错误(实际上不是很常见)时,内存泄漏可能会以不可预测的方式发生,这对于应用程序员来说实际上不可能进行再现或调试。第二,由于它可能犯了一个错误,保守的收藏家必须使用句柄间接引用对象 - 降低性能 - 或者避免重定位对象,因为重新定位无柄对象需要更新对对象的所有引用。如果收集者不知道明显的参考是否是真正的参考,那么这是不可能的。无法重新定位对象会导致对象内存碎片化,更重要的是防止使用下面描述的高级代码复制收集算法。
由于Java HotSpot收集器是完全准确的,它可以使保守的收集器不能做出以下几个强大的设计保证:
Java HotSpot VM采用了最先进的世代复制收藏家,它提供了两大优势:
一代人收藏者利用这样一个事实:在大多数程序中,绝大多数对象(通常大于95%)都是非常短暂的(例如,它们被用作临时数据结构)。通过将新创建的对象隔离到对象托儿所中,代人收藏者可以完成几件事情。首先,由于新对象在对象托儿所中以堆叠的方式连续分配,所以分配变得非常快,因为它仅涉及更新单个指针并对苗圃溢出执行单个检查。第二,当苗圃溢出的时候,苗圃里的大部分物品都已经死亡,垃圾收集者只能将其他地方的少数幸存物移动,避免对苗圃死尸进行填海工作。
上述单线程复制收集器虽然适用于许多部署,但可能成为扩展应用程序的瓶颈,否则将并行化以利用多个处理器。为了充分利用多处理器机器上的所有可用CPU,Java HotSpot VM为年轻一代提供了一个可选的多线程收集器,其中实时对象的跟踪和复制由并行工作的多个线程完成。该实现已经被仔细调整,以平衡所有可用处理器之间的收集工作,允许收集器扩展到大量的处理器。这减少了收集年轻空间的停顿时间,并最大限度地提高垃圾收集吞吐量。并行收集器已经测试了包含超过100个CPU和0的系统。5 TB的堆。并行的年轻代收集器是服务器VM使用的默认垃圾收集算法。
当移动对象时,并行收集器尝试将相关对象保持在一起,从而改善了内存局部性和缓存利用率,从而改进了变异器性能。这是通过深入复制对象来完成的 。
并行收集器还可以更好地使用可用内存。它不需要保留旧对象空间的一部分,以保证复制所有活动对象的空间。相反,它使用一种新颖的技术来推测地尝试复制对象。如果旧的对象空间很小,这种技术允许收集器平滑地切换以压缩堆,而不需要保留任何空间。这样可以更好地利用可用的堆空间。
最后,并行收集器能够根据应用程序的堆分配行为动态调整其可调参数,从而在广泛的应用程序和环境中提高了垃圾回收性能。这意味着更少的手动调整工作为客户。此功能首先引入并行收集器,现在可用于许多其他垃圾收集算法。
与默认单线程收集器相比,并行收集器的盈亏平衡点似乎位于两到四个CPU之间,具体取决于平台和应用程序。预计未来版本将进一步改善。
虽然生成的复制收集器有效地收集大多数死对象,但是较长寿命的对象仍然累积在旧的对象内存区域中。有时,基于低内存条件或编程请求,必须执行旧的对象垃圾回收。默认情况下,Java HotSpot VM使用标准的紧凑收集算法,该算法从根部遍历活动对象的整个图形 ,然后扫描内存,压缩死亡对象留下的空白。通过压缩堆中的间隙,而不是将它们收集到freelist中,消除了内存碎片,并通过消除freelist搜索来简化旧对象分配。
对于需要大堆的应用程序,默认的旧版标记集合收集器引起的收集暂停通常会导致中断,因为应用程序线程暂停与堆大小成正比的时间段。Java HotSpot VM为旧对象空间实现了可选的并发收集器,可以利用备用处理器周期(或备用处理器)收集大堆,同时暂停应用程序线程很短的时间。这是通过在应用程序线程执行时进行大量跟踪和扫描工作来实现的。在某些情况下,峰值应用吞吐量可能会有小幅下降,因为一些处理器周期用于并发收集活动; 然而,
当前版本的Java HotSpot VM为旧版本引入了一个并行标记紧凑型收集器,旨在提高具有大堆的应用程序的可扩展性。同时的标记扫描收集器着重于减少暂停时间的情况下,并行的旧收集器通过在停止世界暂停期间同时使用许多线程来收集旧一代,着重于提高吞吐量。并行的旧收集器在内部使用许多新颖的技术和数据结构来实现高可扩展性,同时保留精确的垃圾收集的优点,并且在收集周期中具有最少的记帐开销。
有关Java HotSpot VM支持的垃圾收集算法的更多信息,请参阅 内存管理白皮书。
Java编程语言允许使用多个程序执行的并发路径 - 线程。Java编程语言提供了语言层次的线程同步,可以使用细粒度锁定来表达多线程程序。与Java编程语言中的其他微操作相比,以前的经典VM中的同步实现非常低效,这使得细粒度同步成为主要的性能瓶颈。
Java HotSpot VM融合了前所未有的竞争和竞争同步操作技术,从而大大提升了同步性能。动态地构成大多数同步的无约束同步操作是用超快速,恒定时间技术实现的。通过最新的优化,在最好的情况下,即使在多处理器计算机上,这些操作也基本上没有成本。相关的同步操作使用高级自适应旋转技术来提高吞吐量,即使对于具有大量锁定争用的应用程序。因此,同步性能变得如此之快,这对于绝大多数现实世界的程序来说并不是一个重要的性能问题。
Java HotSpot VM的早期发行版限于寻址四千兆字节的内存 - 即使在64位操作系统(如Solaris OE)上也是如此。而四吉字节对桌面系统来说很多,现代服务器可以包含更多的内存。例如,Sun Fire E25K服务器每个域最多支持1.15 TB的内存。使用64位JVM,基于Java技术的应用程序现在可以利用这种系统的完整内存。
有几类应用程序可以使用64位寻址。例如,那些在存储器中存储非常大的数据集的那些。应用程序现在可以避免从磁盘分页数据或从RDBMS中提取数据的开销。这可以导致在这种类型的应用程序中的显着的性能改进。
Java HotSpot VM现在是64位安全的,服务器虚拟机包括对32位和64位操作的支持。用户可以通过使用命令行标志-d32
或 -d64
分别选择32位或64位操作 。Java Native Interface的用户需要重新编译代码才能在64位VM上运行。
添加了对象打包功能,以最大限度地减少不同大小的数据类型之间浪费的空间。这主要是在64位环境中的优势,但即使在32位虚拟机中也提供了一个很小的优势。
例如:
public class Button { char shape; String label; int xposition; int yposition; char color; int joe; object mike; char armed; } | public class Button { char shape; String label; int xposition; int yposition; char color; int joe; object mike; char armed; } |
---|---|
public class Button { char shape; String label; int xposition; int yposition; char color; int joe; object mike; char armed; } |
:这间浪费空间 color
和 joe
(三个字节垫到 int
边界) joe
和 mike
(在64位VM四个字节来填充到指针边界)现在,字段重新排序是这样的:
... object mike; int joe; char color; char armed; ... |
---|
在这个例子中,不会浪费任何内存空间。
加速Java编程语言性能的大多数尝试都集中在应用为传统语言开发的编译技术。即时(JIT)编译器本质上是传统的编译器,可将Java技术字节码转换为本地机器码。运行在最终用户机器上的JIT实际上执行字节码并在第一次执行时编译每个方法。
但是,JIT编译有几个问题。首先,由于编译器在用户时间内在执行机器上运行 ,所以在编译速度方面受到严格限制:如果速度不是很快,用户会觉察到程序启动或程序的一部分的显着延迟。这需要一个权衡,使得执行高级优化更加困难,这通常会显着降低编译性能。
其次,即使JIT有时间进行完全优化,这种优化对于Java编程语言来说也不如C和C ++这样的传统语言有效。有许多的原因:
因此,在Java语言性能方面取得基本进步的任何尝试都必须为这些性能问题提供非传统的答案,而不是盲目地应用传统的编译器技术。
Java HotSpot VM架构通过使用自适应优化技术来解决上述Java语言性能问题。
自适应优化通过利用有趣的程序属性来解决JIT编译的问题。几乎所有的程序都花费绝大多数时间来执行其代码中的少部分。Java HotSpot VM并不是通过方法编译方法,而是使用解释器立即运行程序,并在程序运行时分析代码以检测程序中的关键热点。然后,它将全球本地代码优化器的注意力集中在热点上。通过避免编译不经常执行的代码(大部分程序),Java HotSpot编译器可以更多地关注程序的性能关键部分,而不必增加整体编译时间。随着程序的运行,该热点监控继续动态进行,
这种方法的一个微妙但重要的好处是,通过延迟编译直到代码已经执行了一段时间(在机器时间测量,而不是用户时间)之后,可以在代码使用的方式上收集信息,然后利用执行更智能的优化。同样,内存占用也减少了。除了在程序中收集有关热点的信息之外,还收集了其他类型的信息,例如用于虚拟方法调用的主叫方被叫方关系的数据。
Java编程语言中虚拟方法调用的频率是一个重要的优化瓶颈。一旦Java HotSpot自适应优化器在执行期间收集关于程序热点的信息,它不仅将热点编译为本机代码,而且还对该代码执行广泛的方法内联。
内联有重要的好处。它显着降低了方法调用的动态频率,从而节省了执行这些方法调用所需的时间。但更重要的是,内联生成更大的代码块,以便优化器处理。这产生了显着增加传统编译器优化的有效性的情况,克服了增加Java编程语言性能的主要障碍。
内联与其他代码优化协同,因为它使它们更有效。随着Java HotSpot编译器的成熟,在大量内联代码块上运行的能力将打开未来更多高级优化的大门。
尽管在最后一节中描述的内联是一个重要的优化,但传统上对于面向动态的面向对象语言(如Java语言)来说,这是非常困难的。此外,在检测热点和内联它们调用的方法是非常困难的时候,仍然不足以提供完整的Java编程语言语义。这是因为用Java语言编写的程序不仅能够即时更改方法调用的模式,还可以将新的Java代码动态加载到正在运行的程序中。
内联是基于一种全球分析的形式。动态加载显着地使内联复杂化,因为它改变了程序中的全局关系。一个新的类可能包含需要在适当的地方内联的新方法。因此,即使在为热点执行代码时,Java HotSpot VM必须能够动态地优化(然后重新优化,如有必要)先前优化的热点。没有这种能力,一般内联不能安全地执行基于Java技术的程序。
Java HotSpot Client和Server编译器都完全支持动态去优化。这使得能够进行积极和乐观的优化以及其他技术,例如后面描述的全速调试。
Java HotSpot Client Compiler是一个简单,快速的三阶段编译器。在第一阶段,平台无关的前端从字节码构建高级中间表示(HIR)。HIR使用静态单分配(SSA)形式来表示值,以便更容易地实现在IR构建期间和之后执行的某些优化。在第二阶段,平台特定的后端从HIR生成低级中间表示(LIR)。最后阶段使用定制版本的线性扫描算法在LIR上执行寄存器分配,在LIR上进行窥视孔优化,并从中生成机器码。
重点在于从字节码中提取和保留尽可能多的信息。客户端编译器专注于本地代码质量,并且执行非常少的全局优化,因为在编译时通常是最昂贵的。
针对典型服务器应用程序的性能配置文件调整服务器编译器。Java HotSpot Server Compiler是一个高端的完全优化编译器。它使用基于高级静态单分配(SSA)的IR进行优化。优化器执行所有经典优化,包括死代码消除,循环不变提升,常见子表达式消除,常量传播,全局值编号和全局代码运动。它还具有更具体针对Java技术的优化,例如零检查和范围检查消除以及异常抛出路径的优化。寄存器分配器是一个全局图形着色分配器,充分利用RISC微处理器中常见的大型寄存器集。编译器高度便携,依靠机器描述文件来描述目标硬件的所有方面。虽然编译器通过JIT标准缓慢,但它仍然比传统的优化编译器快得多,而改进的代码质量通过减少编译代码的执行时间来回馈编译时间。
Java HotSpot编译器支持一套高级优化,以实现传统直线程序和面向对象编程风格的高性能。其中一些优化包括:
Java HotSpot VM支持许多高级功能,以实现高可扩展性,高性能和企业级可靠性,可用性和可维护性。
Java HotSpot VM最近增加了自动调整自适应机制,称为 人体工程学。目前,人体工程学体现在两个主要领域。首先,根据机器的物理配置(例如考虑处理器数量和可用物理内存),客户端VM或服务器虚拟机将自动选择。特别是,对于具有较大数量处理器和较大数量的RAM的机器,将选择“服务器虚拟机”,并将自动选择垃圾收集堆的大小,以便在这样的硬件上进行合理的服务器端应用程序。第二,Java HotSpot VM中的垃圾收集算法现在是自调整的,所以不再需要明确规定年轻一代的相对尺寸。垃圾收集器将自动调整,以提高应用程序的吞吐量并缩短暂停时间。人机工程学技术可自动提高服务器端应用程序的可扩展性,并计划在未来发布的这一领域开展更多工作。
除了Java HotSpot VM架构启用的核心面向对象优化之外,VM和Sun Java运行时环境还支持其他一些关键性能优化:
get
和 put
方法调用。结合新I / O API提供的网络和文件I / O的大型性能和可扩展性改进,Java编程语言应用程序现在可以实现与C和C ++编码的应用程序相似的吞吐量。新的I / O缓冲区优化也适用于其他问题领域,例如3D图形,在Java平台和外部世界之间传输大量数据。Java HotSpot VM的当前版本是迄今为止最可靠的。基于Sun Microsystems,Inc.执行各种大型应用程序,VM的最新版本为企业应用程序的可靠性和可用性设置了新的记录。
Java HotSpot VM包含Java虚拟机工具接口(JVM TI)的参考实现。该接口允许诸如剖析器,调试器和监视器等工具来观察和控制JVM。包括的功能有:
Java HotSpot VM中的几个附加功能可以提高Java编程语言应用程序的开发和可维护性。
-Xcheck: jni
,用于执行其他JNI检查。这样可以在开发期间运行参数有效性的检查,在部署之前可以检测到它们,并减慢生产运行速度。具体来说,Java HotSpot VM在处理JNI请求之前验证传递给JNI函数的参数以及运行时环境数据。遇到的任何无效数据表示本机代码出现问题,并且在这种情况下,VM将以致命错误终止。面向对象编程的主要优点是可以通过为软件重用提供强大的语言机制来提高开发生产力。然而,实际上这种可重用性很少实现。广泛使用这些机制可以显着降低性能,这导致程序员谨慎使用它们。Java HotSpot技术的令人惊讶的副作用是显着降低了性能成本。Sun认为,这将对面向对象软件的开发产生重大影响,允许企业首次充分利用面向对象的可重用性机制,而不会影响其软件的性能。
这个效果的例子很容易得到。使用Java编程语言的程序员的调查将快速揭示许多人避免使用完全虚拟的方法(并且还写更大的方法),因为他们认为每个虚拟方法调用都会导致显着的性能损失。虚拟方法的无处不在,细粒度使用,如Java编程语言中不是静态或 最终的方法, 对构建高度可重用的类是非常重要的,因为每个这样的方法都作为一个 钩子,允许新的子类修改超类的行为。
由于Java HotSpot VM可以自动嵌入绝大多数的虚拟方法调用,因此性能损失大大降低,在许多情况下完全消除。
很难夸大这个效果的重要性。它有可能从根本上改变面向对象代码的写作方式,因为它显着地改变了使用重要可重用机制的性能权衡。另外,随着面向对象编程的日渐成熟,现在有一种趋向于细粒度对象和更细粒度的方法。这种趋势强烈地提高了未来的编码风格中虚拟方法调用的频率。随着这些较高级编码风格的普及,Java HotSpot技术的优势将更加显着。
Java HotSpot VM为Java应用程序提供最佳性能,提供高级优化,垃圾回收和线程同步功能。此外,VM还提供调试功能,旨在提高基于Java技术的应用程序的整体可靠性,可用性和可维护性。Java HotSpot VM为客户端和服务器环境提供单独的编译器,以便可以根据其目标部署环境优化应用程序。随着64位Java HotSpot Server编译器的可用性,可扩展性得到显着提高。
使用Java HotSpot VM,客户端应用程序启动速度更快,需要更小的内存占用,而服务器应用程序可以在长期内实现更好的持续性能。这两种解决方案都能提供极其可靠,安全可维护的环境,以满足当今企业客户的需求。
Java HotSpot VM包含在Java SE平台环境中。它可在 Java sun 对以下环境:
Java HotSpot VM作为Apple Computer,Inc.的Macintosh OS X操作系统的一部分发货。来自Hewlett-Packard的用于其PA-RISC硬件平台的Java HotSpot Server VM也包含在Java SE技术的发行版中。
这些网站提供其他信息: