[英]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:
购买、阅读和理解Effective Java 。 也可以上网
测量,测量和测量。 使用尽可能接近真实数据和生产硬件来定期运行基准测试。 低延迟应用程序通常被更好地视为设备,因此您需要考虑部署的整个框,而不仅仅是特定的方法/类/包/应用程序/JVM 等。生产。
不要在应用程序中安排的线程数超过底层硬件上的内核数。 请记住,操作系统将需要线程执行和可能共享相同硬件的其他服务,因此您的应用程序可能需要使用少于最大可用内核数。
生成大字符串时使用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.