使用实时Java进行开发,第2部分 改善服务质量 - 编程入门网
of operation times:
11ms - 12ms 82 0 %
12ms - 13ms 250 2 %
13ms - 14ms 19 0 %
14ms - 15ms 50 0 %
15ms - 16ms 339 3 %
16ms - 17ms 889 8 %
17ms - 18ms 730 7 %
18ms - 19ms 411 4 %
19ms - 20ms 287 2 %
20ms - 30ms 1051 10 %
30ms - 40ms 504 5 %
40ms - 50ms 846 8 %
50ms - 60ms 1168 11 %
60ms - 70ms 1434 14 %
70ms - 80ms 980 9 %
80ms - 90ms 349 3 %
90ms - 100ms 28 0 %
100ms - 112ms 7 0 %
使用实时收集器显著缩短了最大操作时间,但是同时也增加了操作时间跨度。更糟的是,吞吐率大大降低。 最后一步是为工作者线程使用 RealtimeThread,而不是常规 Java 线程。我们创建一个 RealtimeThreadFactory 类,我们可以将该类提供给 Executors 服务,如清单 10 所示: 清单 10. RealtimeThreadFactory 类
如果将 RealtimeThreadFactory 类的一个实例传递给 Executors.newFixedThreadPool() 服务器,将导致工作者线程变为使用具有最高优先级的 FIFO 调度机制的 RealtimeThread。垃圾收集器仍然会在需要执行工作时中断这些线程,但其他较低优先级任务不会干扰工作者线程:
通过此更改,我们显著改善了最差的操作时间(降低到 19 毫秒)和总吞吐量(提升到每秒 357 个操作)。所以我们显著改善了操作时间的易变性,但是在吞吐量性能上付出了昂贵的代价。垃圾收集器的操作(使用每 10 毫秒中的至多 3 毫秒)解释了为什么通常需要约 12 毫秒的操作可改善至 4 - 5 毫秒,这也是大量操作现在需要花 16 - 17 毫秒时间的原因。吞吐量的下降可能比预期更严重,因为除了使用 Metronome 垃圾收集器,实时 JVM 还修改了预防优先级反转的锁定原语,优先级反转是使用 FIFO 调度时的一个重要问题(参见 “实时 Java,第 1 部分: 使用 Java 语言编写实时系统”)。不幸的是,主线程与工作者线程之间的同步导致了最终影响吞吐量的大量开销,但是我们没有将其作为任何操作时间的一部分来进行 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |