17611538698
webmaster@21cto.com

Java 提议将降低 GC 延迟

编程语言 0 1328 2022-02-10 11:16:27

提案将在默认 GC 中实现区域固定,以便 Java 线程永远不必等待垃圾收集操作完成。

图片


Java 垃圾收集的概念:


通过删除未使用的对象来重新分配内存。此功能将通过开发Java 标准人员思考的提案中改进。


图片



OpenJDK Java 社区中提出的JDK 增强提案 (JEP:https://openjdk.java.net/jeps/423)呼吁通过将区域固定到 G1(垃圾优先),以减少垃圾收集器的延迟,Java 本地接口 (JNI) 关键区域期间不必禁用收集。该计划的目标如下:


  •  JNI 关键区域,不会导致线程停止。

  • JNI 关键区域,启动垃圾收集没有额外延迟。

  • 当没有 JNI 关键区域处于活动状态时,GC 中的最小回归暂停时间。

  • 当没有关键 JNI 区域处于活动状态时,GC 暂停时间没有回归。


支持此提案的人员指出,为了与 C 和 C++ 等非托管编程语言的互操作性,JNI 定义了获取和释放指向 Java 对象直接指针的函数。这些函数必须成对出现:首先,获取指向对象的指针;然后,在使用对象后,指针释放。


这样的函数对中的代码被认为是在临界区中运行的,使用的Java对象就是临界区。当 Java 线程处于临界区时,JVM 在垃圾回收期间不得移动关联的临界对象,本质上是在 GC 移动其他对象时将它们锁定在适当的位置。当线程处于临界区时,JVM 可能会禁用 垃圾回收 GC。


默认的 GC,G1将采用后一种方法,在每个关键区域禁用收集,这会显着降低延迟。根据正在考虑的提议,Java 线程将不会再等待 G1 GC 操作完成。该提案的目标将通过在主要和次要收集操作期间扩展 G1 以固定任意区域来实现。


该提案假定 JNI 关键区域的预期使用不会发生变化;它们将继续被谨慎使用并且持续时间较短。当应用程序同时固定多个区域时,存在堆耗尽的风险。目前还没有解决方案,但是Shenandoah GC在 JNI 关键区域期间锁定内存区域并且没有这个问题的事实表明这对于 G1 来说不是问题。


该提案目前没有引用可能引入此功能的 Java 版本。


标准 Java 的下一个版本JDK(Java Development Kit)18将于 2022年3 月 22 日发布,其功能集已被冻结。而JDK 19 会在 9 月发布。


来源:Oracle官网,21CTO

评论