繁体   English   中英

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

[英]What is your development checklist for Java low-latency application?

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

这是我的清单
1. 使你的对象不可变
2.尽量减少同步方法
3.锁定顺序应有据可查,并小心处理
4. 使用分析器
5.利用Amdhal定律,求出顺序执行路径
6. 使用 Java 5 并发工具和锁
7. 避免线程优先级,因为它们依赖于平台
8.可以使用JVM预热
9. 偏好不公平锁定策略
10. 避免上下文切换(许多线程导致适得其反)
11.避免装箱、拆箱
12. 注意编译器警告
13.线程数应等于或小于核心数

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

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

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

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

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

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

如果您想查看真实世界的低延迟 Java 应用程序及其架构的足够详细信息,请查看 LMAX:

LMAX 架构

购买、阅读和理解Effective Java 可以上网

测量,测量和测量。 使用尽可能接近真实数据和生产硬件来定期运行基准测试。 低延迟应用程序通常被更好地视为设备,因此您需要考虑部署的整个框,而不仅仅是特定的方法/类/包/应用程序/JVM 等。生产。

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

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

生成大字符串时使用StringBuilder而不是String 例如查询。

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

正如 Knuth 所说,“过早的优化是万恶之源”。

我认为“仅在适当的地方使用可变对象”比“使您的对象不可变”更好。 许多非常低延迟的应用程序都有对象池,它们可以重用以最小化 GC。 不可变对象不能以这种方式重用。 例如,如果您有一个 Location 类:

class Location {
    double lat;
    double lon;
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM