Java HotSpot 执行引擎架构

Wesley13
• 阅读 767

第一章简介和概述

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几乎支持企业应用程序的开发,部署和管理的所有方面,并被以下各项所使用:

  • 集成开发环境(IDE),包括Sun Java Studio工具,NetBeans开源项目,IBM的Eclipse,IntelliJ IDEA,Oracle JDeveloper等。

  • 应用服务器供应商,如Sun Java系统应用服务器,BEA Systems的WebLogic软件,IBM的WebSphere软件,Apple Computer,Inc.的WebObjects软件等。

Sun Microsystems,Inc.也通过使用各种行业标准和内部开发的基准来推动性能提升。这些改进适用于客户端和服务器端Java VM环境。

Java标准版平台包含Java VM的两个实现:

  • Java HotSpot客户端虚拟机,通过减少应用程序启动时间和内存占用,在客户端环境中运行应用程序时获得最佳性能。

  • Java HotSpot Server VM,专为在服务器环境中运行的应用程序的最大程序执行速度而设计。

Java HotSpot VM - 建立在坚实的基础上

Java HotSpot VM建立在强大的功能和功能基础之上。支持动态面向对象优化的体系架构可以实现世界一流的绩效。即使是目前最大的计算机系统,整个虚拟机中的多线程支持也能提供高可扩展性。高可靠性,可用性和可维护性(RAS)功能提供企业级可靠性,同时实现快速开发,内省和管理。

第2章Java HotSpot VM体系结构

概观

Java HotSpot虚拟机是Sun的用于Java平台的虚拟机。它使用许多先进技术为Java应用程序提供最佳性能,并结合了最先进的内存模型,垃圾收集器和自适应优化器。它是用高级的,面向对象的风格写的,其特点是:

  • 统一对象模型

  • 解释,编译和本机帧都使用相同的堆栈

  • 基于本机线程的抢占式多线程

  • 准确的代际和压实垃圾收集

  • 超快线程同步

  • 动态去优化和积极的编译器优化

  • 在VM启动时生成的特定于系统的运行时程序

  • 编译器接口支持并行编译

  • 运行时分析仅针对“热”方法进行编译工作

JDK包括VM的两种风格 - 客户端产品,以及针对服务器应用程序调整的VM。这两个解决方案共享Java HotSpot运行时环境代码库,但使用不同的编译器来适应客户端和服务器的独特性能特征。这些差异包括编译内联策略和堆默认值。

JDK在发行版中包含这两个系统,所以开发人员可以通过指定-client或 选择他们想要的系统 -server

虽然服务器和客户端虚拟机类似,服务器虚拟机已经被特别调整,以最大化最高运行速度。它旨在执行长时间运行的服务器应用程序,它们需要尽可能快的运行速度,而不仅仅是快速启动时间或更短的运行时内存占用。

客户端VM编译器作为旧版本JDK使用的经典虚拟机和即时(JIT)编译器的升级。客户端虚拟机为应用程序和小程序提供更好的运行时性能。Java HotSpot客户端虚拟机已经过专门的调整,以减少应用程序启动时间和内存占用,使其特别适合客户端环境。一般来说,客户端系统更适合GUI。

客户端VM编译器不会尝试执行服务器VM中编译器执行的许多更复杂的优化,但作为交换,分析和编译一段代码所需的时间较少。这意味着客户机VM可以启动更快,并且需要更小的内存占用。

服务器VM包含一个高级自适应编译器,它支持通过优化C ++编译器执行的许多相同类型的优化,以及传统编译器无法完成的一些优化,例如跨虚拟方法调用的积极内联。与静态编译器相比,这是一个竞争优势和性能优势。自适应优化技术在其方法上非常灵活,并且通常优于甚至先进的静态分析和编译技术。

这两种解决方案都能提供极其可靠,安全和可维护的环境,以满足当今企业客户的需求。

内存模型

Handleless 对象

在Java虚拟机的先前版本(如Classic VM)中,间接句柄用于表示对象引用。虽然这样可以使垃圾回收过程中的重定位对象更容易,但它代表了一个重大的性能瓶颈,因为对Java编程语言对象的实例变量的访问需要两级间接。

在Java HotSpot VM中,Java代码不使用任何句柄。对象引用被实现为直接指针。这提供了C速度访问实例变量。在内存回收期间重新定位对象时,垃圾收集器负责查找和更新对该对象的所有引用。

Two-Word 对象头

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垃圾收集器的主要功能如下。总的来说,这些功能非常适合需要尽可能高的性能的应用程序,并且对于长时间运行的应用程序,由于分段而导致内存泄漏和内存无法访问的应用程序是非常不希望的。

准确性

Java HotSpot垃圾收集器是一个完全准确的收集器。相比之下,许多其他垃圾收集器是保守的或部分准确的。虽然保守的垃圾收集可能是有吸引力的,因为它很容易添加到没有垃圾回收支持的系统中,但它有一些缺点。一般来说,保守的垃圾回收器容易发生内存泄漏,不允许对象迁移,并可能导致堆碎片。

保守的收藏者不知道所有对象引用所在的位置。因此,通过假设似乎引用对象的记忆词实际上是对象引用,它必须是保守的。这意味着它可以产生某些类型的错误,比如混淆一个对象指针的整数。看起来像一个指针的内存单元格被认为是一个指针 - 而GC变得不准确。这有几个负面影响。首先,当出现这种错误(实际上不是很常见)时,内存泄漏可能会以不可预测的方式发生,这对于应用程序员来说实际上不可能进行再现或调试。第二,由于它可能犯了一个错误,保守的收藏家必须使用句柄间接引用对象 - 降低性能 - 或者避免重定位对象,因为重新定位无柄对象需要更新对对象的所有引用。如果收集者不知道明显的参考是否是真正的参考,那么这是不可能的。无法重新定位对象会导致对象内存碎片化,更重要的是防止使用下面描述的高级代码复制收集算法。

由于Java HotSpot收集器是完全准确的,它可以使保守的收集器不能做出以下几个强大的设计保证:

  • 所有无法访问的对象内存都可以可靠地回收。

  • 可以重新定位所有对象,允许对象内存压缩,从而消除对象内存碎片并增加内存局部性。

    准确的垃圾收集机制可避免意外的内存泄漏,实现对象迁移,并提供全堆压缩。Java Hotspot VM中的GC机制可以很好地扩展到非常大的堆。

世代复印系列

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融合了前所未有的竞争和竞争同步操作技术,从而大大提升了同步性能。动态地构成大多数同步的无约束同步操作是用超快速,恒定时间技术实现的。通过最新的优化,在最好的情况下,即使在多处理器计算机上,这些操作也基本上没有成本。相关的同步操作使用高级自适应旋转技术来提高吞吐量,即使对于具有大量锁定争用的应用程序。因此,同步性能变得如此之快,这对于绝大多数现实世界的程序来说并不是一个重要的性能问题。

64位架构

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; }

:这间浪费空间 color和 joe(三个字节垫到 int边界) joe和 mike(在64位VM四个字节来填充到指针边界)现在,字段重新排序是这样的:

... object mike; int joe; char color; char armed; ...

在这个例子中,不会浪费任何内存空间。

回到顶部

第3章Java HotSpot编译器

概观

加速Java编程语言性能的大多数尝试都集中在应用为传统语言开发的编译技术。即时(JIT)编译器本质上是传统的编译器,可将Java技术字节码转换为本地机器码。运行在最终用户机器上的JIT实际上执行字节码并在第一次执行时编译每个方法。

但是,JIT编译有几个问题。首先,由于编译器在_用户时间_内在执行机器上运行 ,所以在编译速度方面受到严格限制:如果速度不是很快,用户会觉察到程序启动或程序的一部分的显着延迟。这需要一个权衡,使得执行高级优化更加困难,这通常会显着降低编译性能。

其次,即使JIT有时间进行完全优化,这种优化对于Java编程语言来说也不如C和C ++这样的传统语言有效。有许多的原因:

  • Java语言是动态 _安全的_,这意味着它确保程序不违反语言语义或直接访问非结构化内存。这意味着必须经常执行动态类型测试(投射时,存储到对象数组中时)。

  • 与C ++相比,Java语言分配_堆上的_所有对象 ,其中许多对象被分配堆栈。这意味着Java语言的对象分配率要高于C ++。另外,由于Java语言是垃圾回收的,与C ++相比,它具有非常不同类型的内存分配开销(包括潜在的清除和写阻塞开销)。

  • 在Java语言中,大多数方法调用是 _虚拟的_(可能是多态的),并且比C ++更频繁地使用。这意味着不仅方法调用性能更为主导,而且静态编译器优化(特别是全局优化,如内联)对于方法调用来说更难执行。许多传统的优化在呼叫之间是最有效的,并且Java语言中的调用之间的距离减小可以显着地降低这种优化的有效性,因为它们具有较小的代码段。

  • 由于执行动态加载类的强大功能,基于Java技术的程序可以随时更改。这使得执行许多类型的全局优化变得更加困难。编译器不仅可以检测这些优化由于动态加载而变得无效,而且还可以在程序执行期间撤消或重做这些优化,即使它们涉及堆栈中的活动方法。必须完成此任务,而不会以任何方式影响或影响基于Java技术的程序执行语义。

因此,在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客户端编译器

Java HotSpot Client Compiler是一个简单,快速的三阶段编译器。在第一阶段,平台无关的前端从字节码构建高级中间表示(HIR)。HIR使用静态单分配(SSA)形式来表示值,以便更容易地实现在IR构建期间和之后执行的某些优化。在第二阶段,平台特定的后端从HIR生成低级中间表示(LIR)。最后阶段使用定制版本的线性扫描算法在LIR上执行寄存器分配,在LIR上进行窥视孔优化,并从中生成机器码。

重点在于从字节码中提取和保留尽可能多的信息。客户端编译器专注于本地代码质量,并且执行非常少的全局优化,因为在编译时通常是最昂贵的。

Java HotSpot服务器编译器

针对典型服务器应用程序的性能配置文件调整服务器编译器。Java HotSpot Server Compiler是一个高端的完全优化编译器。它使用基于高级静态单分配(SSA)的IR进行优化。优化器执行所有经典优化,包括死代码消除,循环不变提升,常见子表达式消除,常量传播,全局值编号和全局代码运动。它还具有更具体针对Java技术的优化,例如零检查和范围检查消除以及异常抛出路径的优化。寄存器分配器是一个全局图形着色分配器,充分利用RISC微处理器中常见的大型寄存器集。编译器高度便携,依靠机器描述文件来描述目标硬件的所有方面。虽然编译器通过JIT标准缓慢,但它仍然比传统的优化编译器快得多,而改进的代码质量通过减少编译代码的执行时间来回馈编译时间。

编译器优化

Java HotSpot编译器支持一套高级优化,以实现传统直线程序和面向对象编程风格的高性能。其中一些优化包括:

  • _潜在虚拟呼叫的__深度内联_和 _内联_:如上所述,客户机和服务器编译器都使用与全局分析和动态去优化相结合的方法内联,以实现深度内联,从而消除大量的方法调用开销。
  • _快速实例/检查_:Java HotSpot VM和编译器支持一种新颖的技术,用于加速Java编程语言为类型安全而频繁需要的动态类型测试。这进一步降低了面向对象风格的编程运行时成本。
  • _范围检查消除_:Java编程语言规范要求对每个数组访问执行数组边界检查。当编译器可以证明用于数组访问的索引在范围内时,可以消除索引边界检查。
  • _循环展开_:服务器VM功能循环展开,这是一个标准的编译器优化,可以实现更快的循环执行。循环展开增加了循环体大小,同时减少了迭代次数。循环展开也增加了其他优化的有效性。
  • _反馈引导优化_:在将Java字节码编译为优化的机器代码之前,服务器虚拟机将在解释器中执行程序的大量概要分析。此分析数据为编译器提供了有关正在使用的数据类型,通过代码的热路径以及其他属性的更多信息。在某些情况下,编译器会使用这些信息来更积极和乐观地优化代码。如果代码的假定属性之一在运行时被违反,代码将被优化,并被重新编译并重新优化。

 

回到顶部

第4章Java HotSpot VM的高级功能

Java HotSpot VM支持许多高级功能,以实现高可扩展性,高性能和企业级可靠性,可用性和可维护性。

可扩展性

Java HotSpot VM最近增加了自动调整自适应机制,称为 人体工程学。目前,人体工程学体现在两个主要领域。首先,根据机器的物理配置(例如考虑处理器数量和可用物理内存),客户端VM或服务器虚拟机将自动选择。特别是,对于具有较大数量处理器和较大数量的RAM的机器,将选择“服务器虚拟机”,并将自动选择垃圾收集堆的大小,以便在这样的硬件上进行合理的服务器端应用程序。第二,Java HotSpot VM中的垃圾收集算法现在是自调整的,所以不再需要明确规定年轻一代的相对尺寸。垃圾收集器将自动调整,以提高应用程序的吞吐量并缩短暂停时间。人机工程学技术可自动提高服务器端应用程序的可扩展性,并计划在未来发布的这一领域开展更多工作。

性能

除了Java HotSpot VM架构启用的核心面向对象优化之外,VM和Sun Java运行时环境还支持其他一些关键性能优化:

  • _快速反思_:Java库现在为经常使用的反射对象(如方法和构造函数)生成字节码存根。这种技术将反射调用暴露给Java HotSpot编译器,产生更高的性能,在某些情况下,与服务器VM完全消除与反射调用相关的开销。这在反射密集型代码中提供了显着的加速,例如在序列化,RMI和CORBA代码环境中使用的代码。
  • _新的I / O优化_:Java HotSpot编译器特别处理对新I / O缓冲区对象的操作,生成高质量的机器代码 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虚拟机实现中,当启用调试支持时,应用程序仅在解释器中运行。在调试场景中启用Java HotSpot编译器可以极大地提高性能,并且在许多情况下,可以运行调试支持,始终启用,以提高应用程序的可维护性。另外,调试器的启动可以在抛出异常时触发。
  • _HotSwap支持_:Java HotSpot VM的面向对象架构可实现诸如即时类重定义或“HotSwap”等高级功能。此功能提供了通过调试器API替换正在运行的应用程序中的已修改代码的功能。HotSwap为Java Platform Debugger Architecture提供了功能,可以在执行期间在调试器的控制下更新类。它还允许通过在插入分析代码的方法的版本中进行hotswapping来执行分析操作。

 

Java HotSpot VM中的几个附加功能可以提高Java编程语言应用程序的开发和可维护性。

  • _JNI错误检查_:一个命令行选项 -Xcheck: jni,用于执行其他JNI检查。这样可以在开发期间运行参数有效性的检查,在部署之前可以检测到它们,并减慢生产运行速度。具体来说,Java HotSpot VM在处理JNI请求之前验证传递给JNI函数的参数以及运行时环境数据。遇到的任何无效数据表示本机代码出现问题,并且在这种情况下,VM将以致命错误终止。
  • _错误报告_:如果JVM检测到本机代码中的崩溃,例如由开发人员编写的JNI代码,或者JVM本身崩溃,它将打印并记录有关崩溃的调试信息。此错误消息通常将包括诸如功能名称,库名称,源文件名称和发生错误的行号的信息。结果是开发人员可以更轻松,更有效地调试他们的应用程序。如果错误消息表明JVM代码本身存在问题,则允许开发人员提交更准确有用的错误报告。
  • _信号链接设施_:信号链接使Java平台能够更好地与安装自己的信号处理程序的本机代码进行互操作。该设施适用于Solaris OE和Linux平台。引入了信号链接工具来弥补Java HotSpot VM以前版本中的信号处理问题。在1.4版本之前,Java HotSpot VM不允许应用程序安装的信号处理程序处理某些信号,例如SIGBUS,SIGSEGV或SIGILL,因为这些信号处理程序可能会与Java HotSpot VM内部使用的信号处理程序冲突。

 

回到顶部

第5章对软件可重用性的影响

概观

面向对象编程的主要优点是可以通过为软件重用提供强大的语言机制来提高开发生产力。然而,实际上这种可重用性很少实现。广泛使用这些机制可以显着降低性能,这导致程序员谨慎使用它们。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 对以下环境:

  • 适用于SPARC平台的Solaris操作环境。
  • 适用于Intel平台的Solaris操作环境。
  • Linux操作系统:英特尔平台正式支持多种版本的Red Hat Enterprise Linux,SuSE Linux和Sun Java Desktop系统。最新版本的Java SE平台在其他Linux平台上进行了有限的测试。有关详细信息,请参阅 Java SE 支持的系统配置
  • 英特尔平台上的Microsoft Windows。

Java HotSpot VM作为Apple Computer,Inc.的Macintosh OS X操作系统的一部分发货。来自Hewlett-Packard的用于其PA-RISC硬件平台的Java HotSpot Server VM也包含在Java SE技术的发行版中。

回到顶部

资源

这些网站提供其他信息:

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这