Java 使用ThreadPoolExecutor的CPU性能

Java 使用ThreadPoolExecutor的CPU性能,java,multithreading,Java,Multithreading,我正在使用在优先级队列上执行的ADPool Executor。我已将最小池大小设置为5,最大池大小设置为50。当我们运行负载测试时,我们看到CPU跳跃了10%。线程转储显示 池-1-线程-5“优先级=3 tid=0x020f69a0 nid=0xa3等待条件[0xb517f000..0xb517f970] 在sun.misc.Unsafe.park(本机方法) 位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:118)

我正在使用在优先级队列上执行的ADPool Executor。我已将最小池大小设置为5,最大池大小设置为50。当我们运行负载测试时,我们看到CPU跳跃了10%。线程转储显示

池-1-线程-5“优先级=3 tid=0x020f69a0 nid=0xa3等待条件[0xb517f000..0xb517f970] 在sun.misc.Unsafe.park(本机方法) 位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:118) 位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1841) 位于java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:200) 位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:470) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) 运行(Thread.java:595)

想知道我在ThreadPoolExecutor中使用的prestartAllCoreThreads()会有性能问题吗


TIA

ThreadPoolExecutor创建的线程将在
sun.misc.Unsafe.park
方法中等待新消息。ThreadPoolExecutor内部有一个
Runnable
队列,它将分配给等待的线程。如果您的系统空闲或相当安静,预计会看到相当多的线程此方法中有w个线程正在等待


如果您正在分析系统,此方法通常会突然出现,成为时间的关键消耗者。如果线程大部分时间都在等待工作,则会出现这种情况。

sun.misc.Unsafe.park方法是ThreadPoolExecutor创建的线程等待收到新消息的地方。线程内部PoolExecutor有一个
Runnable
s队列,它将分配给等待的线程。如果您的系统处于空闲状态或相当安静,那么在这个方法中会看到相当多的线程等待


如果您正在评测一个系统,此方法通常会突然出现,成为时间的关键消耗者。如果线程大部分时间都在等待工作,则会出现这种情况。

空闲线程不会执行任何操作,无论您有5个或5000个线程。创建线程会产生开销并消耗资源,但一旦创建线程,它们只会浪费内存而不是cpu。BTW:你确定你想要的线程比你的内核多吗?(或者你有50个空闲内核)如果线程是IO绑定的,那么线程多于内核是有意义的,但是线程太多会浪费CPU时间和过多的上下文切换。有关非常有趣的解释,请参阅。空闲线程不会做任何事情,无论您有5个或5000个线程。创建线程会产生开销并消耗资源,但一旦创建线程,它们就会消耗资源只浪费内存,不浪费cpu。顺便问一下:你确定你想要的线程比你的内核多吗?(或者你有50个空闲内核)如果是IO绑定的,线程数多于内核数是有意义的,但是线程数过多会浪费CPU时间和过多的上下文切换。有关非常有趣的解释,请参阅。评测通常显示CPU时间…否?我的意思是,我同意,如果要连续轮询线程的当前堆栈,大部分时间都是真实时间在大多数系统中,很可能是在等待新任务。如果一些线程的大部分时间(比如说80%)都在park中,这是否意味着(除了上下文切换)该时间“没有被使用?”“是什么让应用程序变慢了?评测通常会显示CPU时间……不是吗?”?我的意思是,我同意,如果你持续轮询线程的当前堆栈,大多数系统中的大部分实际时间可能都花在等待新任务上。如果一些线程的大部分时间(比如说80%)都在公园里,这是否意味着(除上下文切换外)这些时间“没有被使用”,并且不是减慢应用程序速度的一部分?