当前位置: 首页 > 面试题库 >

带corePoolSize = 0的ScheduledThreadPoolExecutor导致一个CPU内核上的负载为100%

康恩
2023-03-14
问题内容

提供以下配置,ScheduledThreadPoolExecutor每5秒运行一次简单任务:

int corePoolSize = 0;
ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(corePoolSize);

Runnable task = () -> System.out.println("XXX");
executor.scheduleAtFixedRate(task, 5, 5, TimeUnit.SECONDS);

在Oracle
JRE上1.8.0_66,创建了一个线程,该线程ScheduledThreadPoolExecutor不断在一个CPU内核上造成100%的负载。调查线程转储会显示以下堆栈跟踪:

"pool-1-thread-1" - Thread t@10
   java.lang.Thread.State: RUNNABLE
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.poll(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

随着corePoolSize = 1仍有池中一个线程。但是,线程基本上始终处于状态TIMED_WAITING,因此处于空闲状态。

ScheduledThreadPoolExecutor具有corePoolSize = 0已知功能,未经验证的错误配置甚至是错误的行为?


问题答案:

看起来你已经打JDK-8129861已经固定在Java中9.它也可以与JDK-8022642。



 类似资料:
  • 问题内容: 有没有一种方法可以在不使用JNI的情况下获取Java下的当前cpu负载? 问题答案: 使用获取并调用它。

  • 我看到一个SO线程说高CPU可能是因为JVM中的高内存。因此,我寻找监视JVM内存使用的工具,并遇到了VisualVM。不幸的是,我对它的理解不够好,无法使用它;我把它安装在QA服务器上,但我想不出一种方法让它找到在其他服务器上运行的测试计划。我在开始测试计划后立即启动它,但什么也没有显示出来。我确实添加了远程服务器,但我看不到任何选择。 我是否应该使用另一个负载生成实用程序或采取任何替代步骤?

  • 在我的Kubernetes安装中,我可以看到cAdvisor为每个POD/容器报告一个称为“CONTAINER_CPU_LOAD_AVERAGE_10S”的度量值。我得到诸如232、6512等值。 那么,这里CPU负载的计量单位是什么呢?对我来说,“CPU负载”和“CPU使用”是可以互换使用的,所以我不明白为什么它不是一个介于[0-100]之间的值? 更新: 这里我放了cAdvisor日志中的相关

  • 问题内容: 我正在尝试构建一个在一致的条件下运行代码段的系统,我想这可能的一种方式是在具有相同布局的docker容器中运行各种程序,保留相同数量的内存,等等。但是,我似乎无法弄清楚如何保持CPU使用率一致。 我似乎可以找到的最接近的东西是“ cpu共享”,如果我了解文档,它会限制cpu的使用,限制系统上正在运行的其他容器/其他进程以及系统上的可用资源。它们似乎无法将容器限制为绝对的CPU使用量。

  • 我用JMeter创建了测试来测试幽灵博客平台的性能。Ghost是用Node.js编写的,安装在云服务器上,有1GB的内存和1个CPU。 我注意到在400个并发用户之后JMeter得到错误。到400个并发用户的负载是正常的。我决定增加CPU,增加了1个CPU。 但是错误重现并添加了2个CPU,总共4个CPU。问题发生在400个并发用户之后。 我想知道是否有可能平衡CPU之间的负载?

  • 问题内容: 假设我的应用程序运行2个线程(例如渲染线程和游戏更新线程)。如果它运行在具有多核CPU的移动设备上(当今通常是这样),我是否可以期望在可能的情况下自动将线程分配给不同的内核? 我知道底层的OS内核(Android linux内核)决定调度。我的问题是我是否需要做 任何其他事情 才能启用多核功能,还是自动而透明的? 问题答案: 您需要做的是允许两个线程尽可能独立地运行。如果您有两个始终在