(完结撒花1-52系列)☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【上部】
并行收集器并行收集器(也称为吞吐量收集器)是类似于串行收集器的分代收集器。 串行和并行收集器之间的主要区别是,并行收集器有多个线程,用于加速垃圾回收。
通过命令行选项 -XX:+UseParallelGC 启用并行收集器。 默认情况下,使用此选项,次要(minor)和主要(Major GC)都将并行运行,以进一步减少垃圾回收开销。
并行垃圾收集器线程数可以使用命令行选项-XX:ParallelGCThreads=<N>控制垃圾收集器线程的数量。
并行收集器中分代的排列在并行收集器中,各代的排列方式是不同的。
并行收集器调优(Parallel Collector Ergonomics)当使用 -XX:+UseParallelGC 选择并行收集器时,它支持自动调优方法,允许您指定行为,而不是分代大小和其他低级调优细节。
指定并行收集器行为的选项
最大垃圾收集暂停时间: 使用命令行选项 -XX:MaxGCPauseMillis=<N>指定最大暂停时间目标,这被解释为需要毫秒或更少的暂停时间;默认情况下,没有最大暂停时间目标。
如果指定了暂停时间目标,则会调整堆大小和与垃圾收集有关的其他参数,以使垃圾收集暂停时间短于指定值。
可能并不总是能够达到所需的暂停时间目标。
这些调整可能会导致垃圾收集器降低应用程序的总吞吐量。
吞吐量吞吐量目标是根据执行垃圾回收所花费的时间与垃圾回收之外所花费的时间(称为应用程序时间)来度量的。目标由命令行选项 -XX:GCTimeRatio= 指定,该选项将垃圾收集时间与应用程序时间的比率设置为1 / (1 + N)。
例如, -XX:GCTimeRatio=19 设置了垃圾收集占总时间的1/20或5%的目标。 默认值为99,结果是垃圾回收时间的目标为1%。
内存空间使用选项 -Xmx 指定最大堆内存占用,此外,收集器还有一个隐式目标,即在满足其他目标的情况下最小化堆的大小。
并行收集器目标的优先级目标是最大暂停时间目标、吞吐量目标和最小占用空间目标,目标按照这个顺序实现:
首先实现最大暂停时间目标。只有在满足了这个要求之后,吞吐量目标才能实现。 同样,只有在前两个目标已经实现之后,才会考虑内存大小目标。
并行收集器默认堆大小
除非在命令行中指定了初始堆大小和最大堆大小,否则将根据计算机上的内存量计算它们。默认的最大堆大小是物理内存的1/4,而初始堆大小是物理内存的1/64。
默认分配给年轻代的最大空间是总堆大小的1/3。
并行收集器初始和最大堆大小的规范
你可以使用选项和 -Xmx 指定初始堆大小和最大堆大小。
如果您知道应用程序需要多少堆才能正常工作,那么可以将 -Xms 和 -Xmx 设置为相同的值。
如果您不知道,那么 JVM 将开始使用初始堆大小,然后增加Java堆,直到找到堆使用量和性能之间的平衡。
要验证默认值,请使用 -XX:+PrintFlagsFinal 选项并在输出中查找 -XX:MaxHeapSize。
例如,在 Linux 上你可以运行以下命令:
java -XX:+PrintFlagsFinal <GC options> -version | grep MaxHeapSize 过长的并行收集器时间和OutOfMemoryError如果在垃圾回收(GC)上花费了太多时间,并行收集器将抛出OutOfMemoryError 错误。
如果超过98% 的总时间用于垃圾回收,而回收的堆不到2%,则抛出 OutOfMemoryError。此特性旨在防止应用程序在较长时间内运行,同时由于堆太小而几乎或根本没有进展。如果需要,可以通过向命令行添加选项-XX:-UseGCOverheadLimit来禁用此特性。
G1垃圾收集器G1垃圾收集器的目标是将多处理器机器扩展到大量内存。
它试图以较高的概率满足垃圾收集暂停时间目标,同时实现较高的吞吐量而不需要进行配置。
G1的目标是使用当前的目标应用程序和环境,在延迟和吞吐量之间提供最佳的平衡。
与吞吐量收集器相比,虽然G1收集器的垃圾收集暂停时间通常要短得多,但应用程序吞吐量也往往略低。
G1是默认收集器。 启用G1G1垃圾回收器是默认回收器,因此通常不需要执行任何其他操作,您可以通过在命令行上提供 -XX:+UseG1GC来显式启用它。
基本概念G1是一个分代的、递增的、并行的、大部分并发的、stop-the-world和疏散垃圾收集器,它监视每个stop-the-world暂停的时间目标。
与其他收集器类似,G1将堆分为(虚拟的)年轻代和老年代。
空间回收的努力集中在年轻代身上,这样做效率最高,偶尔的空间回收在老年代中。
G1的设计原则