我的应用程序使用Executor为大量任务提供线程池.我已经通过分析和基准测试确定,当每个核心有多个线程时,我的应用程序运行得最快.一个好的启发式方法是从每个核心4个线程开始,一直变化,直到你达到> 90%CPU或> 90%RAM.
是否有可以开箱即用的Executor?每个核心(不仅仅是一个)自动使用N个线程,或者理想情况下,根据CPU和RAM使用情况来限制线程池大小?
失败 – 如何以编程方式确定核心数?
解决方法:
更大的问题,imho,是如何衡量内存使用和CPU负载.内存使用很简单:
public double memUsageRatio() {
Runtime r = Runtime.getRuntime();
return (double) (r.totalMemory() - r.freeMemory()) / r.maxMemory();
}
对于CPU负载,它可能更成问题,具体取决于您运行的平台.在Linux上,您可以使用:
ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage();
这将返回最后一分钟的系统负载平均值.不幸的是,在Windows上,此方法始终返回-1.过去,我通过计算所有线程的CPU时间总和除以所有处理器的所有经过时间的总和,将其替换为给定时间间隔的系统负载平均值的近似值.这只是一个近似值,但在大多数情况下它的效果非常好:
import java.lang.management.*;
public class CPUUsageCollector implements Runnable {
private final static long INTERVAL = 1000