共计 1762 个字符,预计需要花费 5 分钟才能阅读完成。
基于替换 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%。