【发布时间】:2018-10-15 13:49:41
【问题描述】:
作为 java JDK10 的一部分,JEP307 是 Parallel Full GC for G1 realsed。
我试图理解它的描述,但我仍然不确定我是否正确理解了这个想法。
我怀疑它是否与 并发垃圾
【问题讨论】:
作为 java JDK10 的一部分,JEP307 是 Parallel Full GC for G1 realsed。
我试图理解它的描述,但我仍然不确定我是否正确理解了这个想法。
我怀疑它是否与 并发垃圾
【问题讨论】:
作为一个简单的解释 - 垃圾收集器有两种可能的收集类型,“增量”和“完整”。增量收集是两者中更好的一种,因为它会经常做一些工作。完全收集通常更具破坏性,因为它需要更长的时间并且通常必须在整个程序运行时停止它的执行。
正因为如此,大多数现代 GC(包括 G1)一般都会尽量确保在正常情况下,增量收集就足够了,永远不需要完整收集。但是,如果以不可预知的方式使不同代的大量对象符合垃圾回收条件,那么有时完全 GC 可能是不可避免的。
目前G1全集合实现只有单线程。这就是 JEP 的用武之地 - 它旨在将其并行化,以便在确实发生完整 GC 时,它在可以支持并行执行的系统上更快。
【讨论】:
G1 垃圾收集器因执行单线程完整 GC 循环而臭名昭著。当您需要所有可以收集的硬件来寻找未使用的对象时,我们在单个线程上遇到了瓶颈。在 Java 10 中,他们修复了这个问题。完整的 GC 现在使用我们投入的所有资源运行。 为了证明这一点,我编写了 ObjectChurner,它创建了一堆不同大小的字节数组。它会在物体上保持一段时间。大小是随机的,但以可控的、可重复的方式。
【讨论】:
Java 10 通过迭代改进其现有算法来减少 Full GC 暂停时间。直到 Java 10 G1 Full GCs 在单线程中运行。没错——你的 32 核服务器和它的 128GB 将停止并暂停,直到单个线程取出垃圾。在 Java 10 中,这已被改进为并行运行。这意味着 Full GC 将在多个线程上并行运行,尽管在完成时仍会暂停 JVM 的进程。线程数可以使用-XX:ParallelGCThreads进行可选配置。
这是对 Java 10 中 G1 算法的一个很好的改进,可以减少大多数用户在最坏情况下的暂停时间。这是否意味着 Java GC 暂停已成为过去?不 - 它减少了问题,但由于 G1 不会与您的应用程序同时运行其收集周期,它仍会定期暂停应用程序,并且 Full GC 暂停仍会随着堆大小的增大而增加。我们在上一篇博文中讨论了其他一些垃圾收集器,它们可能会在未来解决这个问题。
【讨论】:
G1 收藏家
Java 8 更新 20 刚刚推出的另一个漂亮优化是 G1 收集器字符串重复数据删除。由于字符串(及其内部 char[] 数组)占用了我们的大部分堆空间,因此进行了一项新的优化,使 G1 收集器能够识别在您的堆中多次重复的字符串,并更正它们以指向相同的内部 char [] 数组,以避免同一字符串的多个副本低效地驻留在堆中。您可以使用-XX:+UseStringDeduplicationJVM 参数来尝试一下。
G1GC 中的并行 Full GC
G1 垃圾收集器因执行单线程完整 GC 循环而臭名昭著。当您需要所有可以收集的硬件来寻找未使用的对象时,我们在单个线程上遇到了瓶颈。在 Java 10 中,他们修复了这个问题。完整的 GC 现在使用我们投入的所有资源运行。
JVM 参数:-Xlog:gc,gc+cpu::uptime -Xmx4g -Xms4g -Xlog:gc*:details.vgc 这会将每个 GC 事件及其 CPU 使用率输出到标准输出,仅将正常运行时间显示为标签。设置-Xlog:gc* 类似于以前的Java 版本的-XX:+PrintGCDetails。
【讨论】:
Java 10 通过迭代改进其现有算法来减少 Full GC 暂停时间。直到 Java 10 G1 Full GCs 在单线程中运行。没错——你的 32 核服务器和它的 128GB 将停止并暂停,直到单个线程取出垃圾。在 Java 10 中,这已被改进为并行运行。这意味着 Full GC 将在多个线程上并行运行,尽管在完成时仍会暂停 JVM 的进程。线程数可以使用-XX:ParallelGCThreads.进行可选配置
【讨论】: