hugh Lee
2017-03-16 13:11
采纳率: 100%
浏览 4.8k
已采纳

JAVA的多个线程可以同时在CPU的多个核心上运行么?

现在的电脑cpu 都是多核,CPU对于各个线程的调度是随机的(分时调度),如果程序中 开启了多个线程,那么这几个线程是分别同时运行在不同的核心上呢,还是由于 JVM对线程的调度,使得 这几个线程 分时 跑在一个核心上呢?
(另外,在一个核心上 是否 能有两个 线程 同时运行呢?(不采用分时调度))
搜了半天 但是都是有些模棱两可 ,只好特来请教,谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • oyljerry 2017-03-16 13:42
    已采纳

    Java线程是在JVM进程中调度的,操作系统是基于线程调度的,所以多个线程会在多核上进行调度。

    点赞 2 评论
  • Susy Yang 2021-02-22 04:03

    可看用火焰图来分析,然后调试CPU:

    全文,请参见原文:如何使用性能分析来调试Python的性能问题 【使用火焰图找出问题根源】
    https://blog.csdn.net/SusyYang/article/details/113927192


    如何使用火焰图调试性能问题(并在服务器上节省下6.6万美元)

    假设下面的火焰图对应呈现上图中央处理器利用率飙升的时段。在此高峰期间,服务器的中央处理器的使用情况如下:

    • Foo()消耗的时间是75%
    • Bar()消耗的时间是25%
    • 10万美元的服务器成本

    您可把火焰图视为超详细的饼图,其中:

    • 火焰图的宽度代表着整个时段
    • 每个节点代表一个功能
    • 最大的节点占用了大部分中央处理器资源
    • 每个节点被其上方的节点调用

    在这种情况下,’foo()’ 占据了整时间范围的75%,因此我们可以改进`foo()`及其调用的函数来减少中央处理器的利用率(并节省$$)。

    用Pyroscope工具创建火焰图和表格

    为了用代码重现上文的例子,我们将使用Pyroscope工具 — 专门针对性能调试问题提供持续的性能分析,并且是开源。

    为了模拟服务器,我写了 ’work(duration)’ 函数,该函数在该持续时间段内模拟工作。这样,我们就可以通过下述代码构建火焰图,来复现’foo()’ 所用的75%时间和 ‘bar()’ 所用的25%时间:

     # 模拟每次迭代中央处理器的时间
    def work(n):
        i = 0
        while i < n:
            i += 1
    
    # 模拟中央处理器运行7.5秒
    def foo():
        work(75000)
    
    # 模拟中央处理器运行2.5秒
    def bar():
        work(25000)
    点赞 评论

相关推荐 更多相似问题