【问题标题】:Is Java 8 API internal implementation of collections using the new Java Stream API?Java 8 API 是否使用新的 Java Stream API 在内部实现集合?
【发布时间】:2016-08-10 00:47:03
【问题描述】:

Java 8 Stream API 允许在执行代码时使用 implicit 并行化。我在任何地方都找不到 Java 8 中集合(例如 HashSet 和 HashMap)的内部实现是否正在使用这些。关键是,如果是这样,那么使用这些集合的单线程代码将执行(内部)多线程,从而可能显着提高性能。

我们有一个单线程程序,当它在 JVM 中执行时,JVM 正在使用 100%(或大约那么多)的 8 个内核。我们想知道为什么以及出于什么目的以及是否可以控制这一点。在 JVM 中并行执行的情况下,用于计算的有效 CPU 时间量可能会更低。因此,如果 A)我们通过同时运行 8 个单线程程序(也作为单线程程序执行)来使用 8 个内核,而不是 B)为单个程序提供 8 个内核,我们可能会做得更好。

【问题讨论】:

    标签: multithreading collections jvm java-8 java-stream


    【解决方案1】:

    至少由于以下原因,现有功能不会突然从顺序执行转变为并行执行:

    • 传递给例程的函数或回调可能不准备被同时调用
    • 在 CPU 内核之间仔细执行负载平衡的应用程序会发现自己突然做得不好,因为假设在一个内核上运行的代码只使用了比预期更多的内核
    • 即使应用程序不会以其他方式使用 CPU 内核,库也无法预测应用程序的问题是否会真正受益于并行处理,即考虑到要处理的元素数量和处理单个元素

    您可能会注意到新的 API 明确允许并行处理,例如 Arrays utility class 现在除了 sort 之外还提供 parallelSort 等。

    进一步注意,Stream API 也不允许隐式并行化,您必须显式请求并行流,使用Collection.parallelStream()Stream.parallel() 或使用@ 987654328@ 为StreamSupport 中工厂方法的parallel 参数。

    【讨论】:

    • 感谢您的解释,您对此处的显式与隐式有所了解。我的意思是,只需为 parallelSort() 替换 sort() 就可以进行并行化(“隐式”),而程序员不必自己进行任何并行化。从这个意义上说,它是隐含的:-)。关于你的三点:1)明确 - 但我想到的场景是关于没有提供回调的情况; 2) 和 3) 这就是我的意思,但 Java 开发人员真的考虑过吗?事实上,该进程运行大约 700% cpu。所有垃圾收集都是并行完成的吗?
    • 如果只是垃圾回收,不违反2)和3)吗?我们运行的代码肯定没有“并行”,也没有任何线程。我不能在这里粘贴它,因为它是一个学生作业解决方案,但导入应该告诉:import java.util.Arrays;导入 java.util.HashMap;导入 java.util.HashSet;导入 java.util.StringJoiner;
    • Parallel GC 可以通过命令行配置,所以不会突然出现(也不是 Java 8 的新特性)。此外,如果正在进行大量计算(除非内存有真正的压力),GC 线程被设计为不碍事。所以很难相信这是 CPU 利用率的唯一原因,但您可以通过 -XX:+UseSerialGC 轻松验证是否是......
    • 很好的提示,谢谢。我们应用了开关,是的,现在利用率下降到 100%。所以只有GC。但是,该程序现在因堆空间不足而崩溃。如果在没有开关的情况下运行,它会运行很多分钟,并且不会在堆空间上崩溃。看来开关不仅指示使用单线程进行GC,而且还更改了策略。但是,htop 的输出表明 GC 线程是与主程序线程以相同优先级运行的常规系统线程,即如果我们运行另一个并行程序,它将与 GC 线程平等竞争,这不是很好。
    • 使用 -XX:ParallelGCThreads=#,其中 # 是 GC 线程的数量(这里很好解释:developer.amd.com/…)导致大约 100% 的 CPU 利用率(单核)并且不缺少堆空间错误。
    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2015-08-03
    • 2016-08-22
    • 2016-07-06
    相关资源
    最近更新 更多