Java低延迟应用程序的开发清单是什么?

时间:2010-04-04 13:51:42

标签: java multithreading concurrency low-latency

我想为Java低延迟应用程序创建全面的清单。你能在这里添加清单吗?

这是我的清单
1.使你的对象不可变
2.尝试减少同步方法
3.锁定顺序应妥善记录,并小心处理 4.使用分析器
5.使用Amdhal定律,找到顺序执行路径
6.使用Java 5并发实用程序,并锁定
7.避免使用Thread优先级,因为它们与平台有关 8.可以使用JVM预热 9.不喜欢不公平的锁定策略 10.避免上下文切换(许多线程导致反效果)
11.避免拳击,取消拳击 12.注意编译器警告
13.线程数应等于或小于核心数

低延迟应用程序每隔毫秒调整一次。

12 个答案:

答案 0 :(得分:7)

虽然不变性很好,但不一定会改善延迟。确保低延迟可能取决于平台。

除了一般性能外,GC调整非常重要。减少内存使用量将有助于GC。特别是如果你可以减少需要移动的中年对象的数量 - 保持对象长寿或短寿。还要避免触及烫发的任何东西。

答案 1 :(得分:5)

避免装箱/拆箱,尽可能使用原始变量。

答案 2 :(得分:4)

购买,阅读和了解 Effective Java。另外available online

答案 3 :(得分:4)

在消息处理路径上尽可能避免上下文切换 结果:使用NIO和单事件循环线程(reactor)

答案 4 :(得分:4)

避免广泛的锁定和多线程,以免破坏现代处理器(及其缓存)中的增强功能。然后,您可以使用单个线程达到其令人难以置信的限制(每秒600万次交易),且延迟非常低。

如果你想看到一个现实世界的低延迟Java应用程序及其架构的详细信息,请看LMAX:

The LMAX Architecture

答案 5 :(得分:2)

测量,测量和测量。使用尽可能靠近生产硬件的实际数据来定期运行基准测试。低延迟应用程序通常被更好地视为设备,因此您需要考虑部署的整个框不仅仅是特定的方法/类/包/应用程序/ JVM等。如果您没有在生产环境中构建逼真的基准测试,那么您将会遇到意外情况。生产。

答案 6 :(得分:1)

不要在应用程序中安排比在底层硬件上拥有核心更多的线程。请记住,操作系统将需要线程执行,并且可能需要共享相同硬件的其他服务,因此可能需要使用您的应用程序以使用少于最大可用内核数。

答案 7 :(得分:1)

  • 考虑使用非阻塞方法而不是同步。
  • 考虑在覆盖数据结构和锁时使用易失性或原子变量。
  • 考虑使用对象池。
  • 使用数组而不是列表,因为它们对缓存更友好。
  • 通常,对于小型任务,由于锁定以及内存和缓存访问延迟,将数据发送到其他内核可能比在单个内核上处理花费更多时间。因此,考虑通过单个线程处理任务。
  • 降低访问主内存的频率,并尝试使用缓存中存储的数据。
  • 考虑选择专注于性能优化的服务器端C2 JIT编译器,而不是专注于快速启动时间的C1。
  • 当不同线程使用的两个字段可以位于单个缓存行上时,请确保没有虚假的对象字段共享。
  • 阅读https://mechanical-sympathy.blogspot.com/
  • 考虑在TCP上使用UDP

答案 8 :(得分:0)

生成大字符串时,请使用StringBuilder代替String。例如查询。

答案 9 :(得分:0)

另一个重要的想法是让它先工作,然后测量性能,然后隔离任何瓶颈,然后优化它们,然后再次测量以验证改进。

正如Knuth所说,“过早优化是所有邪恶的根源”。

答案 10 :(得分:0)

我认为"仅在适当情况下使用可变对象"优于"使你的对象不变;#34;。许多非常低延迟的应用程序都有重用的对象池,以最大限度地减少GC不可变对象不能以这种方式重用。例如,如果您有Location类:

class Location {
    double lat;
    double lon;
}

您可以在启动时创建一些并反复使用它们,这样它们就不会导致分配和后续的GC。

这种方法比使用不可变的位置对象要复杂得多,所以它只应该在需要的地方使用。

答案 11 :(得分:0)

除了此处建议的开发人员级解决方案之外,考虑加速JIT运行时也是非常有益的,例如Zing和off堆内存解决方案,如Teracotta BigMemory,Apache Ignite以减少Stop-the-world GC暂停。 如果某些使用二进制协议的GUI如Hessian,ZERO-C ICE而不是webservice等非常有效。