基于交换IO优化的Java虚拟机垃圾回收(ACM论文笔记)
ABSTRACT
由于跨平台的可移植性,各种应用程序、框架和服务都构建在Java虚拟机(JVM)上(例如,大数据分析)。但是,它们中的许多都存在垃圾收集(GC)的长延迟,这也降低了系统的吞吐量、效率和可用性。例如,当客户端需要比可用系统内存更大的内存时,操作系统(OS)通常使用它的交换空间来释放存储在内存中的一些非活动内容。在这种情况下,由于I/O时间(即换入/换出),GC延迟可能会更长。本文对JVM中现有的GC策略进行了性能分析。基于分析结果,我们提出了一种有效的GC方案,通过交换I/O优化来补充现有的GC策略来提高GC性能。在这个方案中,我们通过在GC期间与OS交换系统交互来选择性地压缩JVM堆。实验结果表明,我们的方案分别减少了77.5%的GC开销和82.5%的吞吐量。
INTRODUCTION
目前,Java由于其跨平台的可移植性,在大数据分析系统和分布式系统等许多系统中流行起来。这些系统的一些著名例子包括Hadoop和Spark。此外,一个广泛使用的机器学习(ML)库DeepLeaning4Java (DL4J)也是用Java编写的,可以与大数据分析系统或分布式系统相结合,方便开发,高效分析数据。在云环境或虚拟机中执行这些系统需要大量资源。
在这些资源需求中,系统内存需求是关键的,通常是不可预测的。例如,使用虚拟机的客户机可能不知道彼此的资源使用模式以及物理机上的实际资源使用情况。此外,在执行ML工作负载时,很难知道中间过程中发生的临时数据的大小。即使发生这种不可预测的情况,系统也应该确保可用性。因此,如果每个客户端的内存需求超过物理内存总容量,则现有操作系统提供交换系统,将未激活或最近最少使用(LRU)页面交换到磁盘上的交换空间中。如果系统无法处理此问题,应用程序将以内存不足错误(OOME)异常终止。
这些Java应用程序在Java虚拟机(JVM)上执行。JVM中内存管理最重要的组件之一是垃圾收集(GC)。GC是一种自动的内存管理技术,它回收JVM堆空间中未引用的数据。此任务为Stop-The-World (STW)风格,这意味着应用程序将在此任务期间完全停止,从而影响应用程序的性能。并行清理GC (Parallel screpinggc, PSGC)是OpenJDK 8的现有策略,它使用滑动压缩,将引用的数据复制到堆左侧的空白空间中,以避免碎片化。
虽然GC是回收JVM中未引用数据的关键组件,但它会生成不必要的交换I/O操作。例如,当使用交换I/O操作触发带有PSGC策略的GC操作时,交换出的LRU数据可能会被不必要地交换进来,因为GC的压缩过程可能需要交换出的数据。另外,根据PSGC策略,换入的数据可以立即重新换出。这是因为JVM和OS交换系统彼此是不可见的。这种不必要的磁盘I/O将延迟STW,并对应用程序吞吐量产生不利影响,因为访问磁盘的延迟通常比访问内存慢10,000倍。
为了解决这一问题,以往的研究提出了以下解决方案。Veldema等人的通过绑定和压缩目标对象来减少交换量。Zhuang等人的通过减少分割页面所涉及的开销来减少STW。在解决内存压力下的系统交换问题方面,我们的研究与这些工作一致。为了减少交换I/O的开销,最小化了目标数据大小,消除了分割的开销。相反,我们主要通过选择性地压缩JVM堆来优化交换I/O。
在本文中,我们提出了一种高效的JVM GC操作方案,以提高Java应用程序的性能,主要有以下两种方案:(1)我们让JVM通过接口与操作系统交互。该方案允许系统交换信息(例如,数据是否被交换),以交付给JVM。(2)我们提出了一个选择性压缩GC, JVM根据上面来自操作系统的提示有选择地压缩堆。该方案允许操作系统避免不必要的磁盘I/O,从而提高应用程序的吞吐量。我们在OpenJDK 8的PSGC中实现了上述方案。我们使用SPECjvm2008和DaCapo来评估我们的系统,这是行业标准的基准。另外,我们使用SparkBench中的图计算工作负载来评估我们的工作负载。结果表明,该系统的应用性能提高了82.5%。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。