在Java中启用Intel超线程

Rya*_*yan 5 java multithreading hyperthreading

我有一个在四核Intel i7上运行的多线程程序.当我执行时Runtime.getRuntime.availableProcessors(),我得到8,我知道在这个CPU上可以使用超线程.

但是,当我创建线程时,我的CPU级别为4个线程的100%(即非零),这意味着4个线程未被使用.有没有办法在Java中启用超线程?

Chr*_*s K 7

所有现代JVM都使用本机线程,因此实现了超线程,因此这是一个OS/CPU配置设置.

但是,超线程不会为您提供额外的内核,它允许您拥有的四个cpu的细粒度分时.也就是说,当一个线程停滞时,比如等待一页内存飞入缓存,然后另一个线程可以俯冲并利用CPU的一部分.由于更复杂的调度要求,它增加了大约10%的CPU核心大小,并没有使所有应用程序受益.

如果你用四个线程最大化了四个cpus,那么打开或关闭超线程就可以了.它只是意味着那些线程运行热,没有阻塞太多.

Java报告8核CPU而不是4核的原因是因为操作系统告诉Java CPU有8个核心.操作系统认为,由于操作系统已被告知调度线程就好像它是一个8核CPU,这使得对操作系统的超线程的支持更加简单.操作系统像以前一样继续管理线程,忘记了超线程的大部分内部工作,并且当CPU的部分可用时,让CPU管理程序集的低级调度.

可以在此处阅读带有基准的更详细的讨论

  • 我们对自己的Java应用程序进行了广泛的性能分析。令我惊讶的是,与“启用”相比,使用“禁用”超线程的“实时”(高吞吐量)和线程敏感的许多jvm都能获得更好的性能。我怀疑这是因为有人告诉java有可用的线程,但是由于操作无法像超线程营销部门所希望的那样进行流水线化,最终会被延迟。总而言之,如果您要处理高吞吐量的应用程序,则可以尝试测试超线程是否真正有用。 (2认同)