java - 单 CPU 机器的最佳 GC 线程数

标签 java memory-management garbage-collection g1gc

我正在为一个应该使用单个 CPU 核心的应用程序使用 G1 垃圾收集器(这是一个在 Yarn 上运行的 Spark 作业),但可能是因为 JVM 看到了所有可用的核心,它使用了相当多的并行线程,来自18 到 23。这真的很重要吗?我应该手动设置并行线程数吗?

最佳答案

这是一个相当有趣的观察,首先(至少在 jdk-15 上)。

假设这段代码:

public class Sandbox {
      
    public static void main(String[] args) {

        while (true) {
           LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(10_000));
       }

    }
  
}

然后我运行它:java -XX:ActiveProcessorCount=1 Sandbox.java .通过以下方式连接到它:jcmd <PID> VM.flags并注意到一件相当有趣的事情:-XX:+UseSerialGC .由于您指定了单个 CPU,因此没有必要使用 G1GC根据JVM (这是有道理的)。所以要做好准备。


您可以通过以下方式获得您想要的:-XX:ActiveProcessorCount=这就是您的 JVM 将看到的 CPU 数量(并且很可能基于此在内部构建试探法)。

有两种类型的线程 G1用途:ParallelGCThreadsConcGCThreads , 实现不同的目的。

如果我从上面做同样的练习(启动一个进程并连接到它,但是也启用了 -XX+UseG1GC ),我看到了 ParallelGCThreads未更改(默认为 10 ), ConcGCThreads 也未更改(默认为 3 );这对我来说是一个惊喜。或不。这取决于您如何看待它 - VM 试图禁止使用 G1GC开始。

当然,10 个并行线程竞争 1 个 CPU 并不是设置 VM 的好方法。

关于java - 单 CPU 机器的最佳 GC 线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64489101/

相关文章:

java - 如何检查字节数组是 .emf 还是 .wmf 格式

c++ - 访问其他程序使用的内存

ios - AFNetworking CFData 泄漏?

java - 每次加载图像时堆都会增长

java - 完整垃圾收集与主要垃圾收集

java - 无法使用 Firebase 中的 Glide 库加载个人资料图片

java - 如何验证是否捕获到异常

java - Spring Boot application.properties 未读取

java - JVM 中裸 java.lang.Object 的实际大小

c# - 如何确保 winform 被垃圾收集?