基于替换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[1]和Spark[2]。此外,一个宽泛应用的机器学习(ML)库DeepLeaning4Java (DL4J)[4]也是用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倍。为了解决这一问题,以往的钻研[24,27]提出了以下解决方案。Veldema等人的[24]通过绑定和压缩指标对象来缩小交换量。Zhuang等人的[27]通过缩小宰割页面所波及的开销来缩小STW。在解决内存压力下的零碎替换问题方面,咱们的钻研与这些工作统一[24,27]。为了缩小替换I/O的开销,[24]最小化了指标数据大小,[27]打消了宰割的开销。相同,咱们次要通过选择性地压缩JVM堆来优化替换I/O。在本文中,咱们提出了一种高效的JVM GC操作计划,以进步Java应用程序的性能,次要有以下两种计划:(1)咱们让JVM通过接口与操作系统交互。该计划容许零碎替换信息(例如,数据是否被替换),以交付给JVM。(2)咱们提出了一个选择性压缩GC, JVM依据下面来自操作系统的提醒有选择地压缩堆。该计划容许操作系统防止不必要的磁盘I/O,从而进步应用程序的吞吐量。咱们在OpenJDK 8的PSGC中实现了上述计划。咱们应用SPECjvm2008[11]和DaCapo[3]来评估咱们的零碎,这是行业标准的基准。另外,咱们应用SparkBench[10]中的图计算工作负载来评估咱们的工作负载。结果表明,该零碎的利用性能进步了82.5%。