0%

JDK11-ZGC

JDK 11即将于09/25正式发布,包含了诸多新的特性,主要的新特性JEP(JDK Enhancement Proposal 特性增强提议)有17个,参见下表

  • 181: Nest-Based Access Control
  • 309: Dynamic Class-File Constants
  • 315: Improve Aarch64 Intrinsics
  • 318: Epsilon: A No-Op Garbage Collector
  • 320: Remove the Java EE and CORBA Modules
  • 321: HTTP Client (Standard)
  • 323: Local-Variable Syntax for Lambda Parameters
  • 324: Key Agreement with Curve25519 and Curve448
  • 327: Unicode 10
  • 328: Flight Recorder
  • 329: ChaCha20 and Poly1305 Cryptographic Algorithms
  • 330: Launch Single-File Source-Code Programs
  • 331: Low-Overhead Heap Profiling
  • 332: Transport Layer Security (TLS) 1.3
  • 333: ZGC: A Scalable Low-Latency Garbage Collector(Experimental)
  • 335: Deprecate the Nashorn JavaScript Engine
  • 336: Deprecate the Pack200 Tools and API

其中,非常值得大家关注的是JEP-333,ZGC,一个可扩展的低延迟垃圾回收器。ZGC目前仍处于实验阶段,不建议在生产环境使用。
目前使用ZGC需要添加JVM参数:-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

ZGC的目标:

  • GC停顿(Stop the wordld)时间不会超过10ms
  • 能够处理从几百MB到几TB大小的JAVA堆
  • 与G1相比,吞吐量下降不超过15%
  • 为未来的GC功能和优化利用有色对象指针(colored oops)和加载屏障(load barriers)奠定基础
  • 初始只支持Linux/x64

ZGC可以并发执行以下GC任务/阶段:

  • 标记(Marking)
  • 引用处理(Reference processing)
  • 重新分配集的选择(Relocation set selection)
  • 重分配/压缩(Relocation/Compaction)

ZGC的特点描述:

  • concurrent
  • single-generation
  • region-based
  • NUMA-aware

GC是Java的主要优势之一。然而,当GC停顿太长,就会开始影响应用的响应时间。消除或者减少GC停顿时长,Java将在更广泛的应用场景中成为一个更有吸引力的平台。
此外,现代操作系统中可用内存不断增长,用户和程序员都希望JVM能够以高效的方式充分利用这些内存,并且无需长时间的GC暂停时间。

ZGC一个并发,基于region,压缩型的垃圾收集器,只有root扫描阶段会STW,因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。

ZGC的核心设计原则是使用负载屏障(load barrier)与有色指针对象(colored object pointers,colored oops)组合。这使得ZGC能够进行并发操作,比如对象的重定位,Java应用程序线程正在运行时,从Java线程的角度,在Java对象中加载引用字段的行为是会受到负载障碍的影响。除了对象地址以外,有色对象指针包含负载障碍所需的其他信息,用来确定Java线程在使用指针之前是否需要执行某些操作,例如,该对象可能已被重新定位,负载屏障将检测到这种情况并采取合适的行为。

A core design principle/choice in ZGC is the use of load barriers in combination with colored object pointers (i.e., colored oops). This is what enables ZGC to do concurrent operations, such as object relocation, while Java application threads are running. From a Java thread’s perspective, the act of loading a reference field in a Java object is subject to a load barrier. In addition to an object address, a colored object pointer contains information used by the load barrier to determine if some action needs to be taken before allowing a Java thread to use the pointer. For example, the object might have been relocated, in which case the load barrier will detect the situation and take appropriate action.

参考文档:
JDK 11
JEP 333: ZGC: A Scalable Low-Latency Garbage Collector
OpenJDK Wiki About ZGC