我想为Java低延迟应用程序创建全面的清单。你能在这里添加清单吗?
这是我的清单
1.使你的对象不可变
2.尝试减少同步方法
3.锁定顺序应妥善记录,并小心处理
4.使用分析器
5.使用Amdhal定律,找到顺序执行路径
6.使用Java 5并发实用程序,并锁定
7.避免使用Thread优先级,因为它们与平台有关
8.可以使用JVM预热
9.不喜欢不公平的锁定策略
10.避免上下文切换(许多线程导致反效果)
11.避免拳击,取消拳击
12.注意编译器警告
13.线程数应等于或小于核心数
低延迟应用程序每隔毫秒调整一次。
答案 0 :(得分:7)
虽然不变性很好,但不一定会改善延迟。确保低延迟可能取决于平台。
除了一般性能外,GC调整非常重要。减少内存使用量将有助于GC。特别是如果你可以减少需要移动的中年对象的数量 - 保持对象长寿或短寿。还要避免触及烫发的任何东西。
答案 1 :(得分:5)
避免装箱/拆箱,尽可能使用原始变量。
答案 2 :(得分:4)
购买,阅读和了解 Effective Java。另外available online
答案 3 :(得分:4)
在消息处理路径上尽可能避免上下文切换 结果:使用NIO和单事件循环线程(reactor)
答案 4 :(得分:4)
避免广泛的锁定和多线程,以免破坏现代处理器(及其缓存)中的增强功能。然后,您可以使用单个线程达到其令人难以置信的限制(每秒600万次交易),且延迟非常低。
如果你想看到一个现实世界的低延迟Java应用程序及其架构的详细信息,请看LMAX:
答案 5 :(得分:2)
测量,测量和测量。使用尽可能靠近生产硬件的实际数据来定期运行基准测试。低延迟应用程序通常被更好地视为设备,因此您需要考虑部署的整个框不仅仅是特定的方法/类/包/应用程序/ JVM等。如果您没有在生产环境中构建逼真的基准测试,那么您将会遇到意外情况。生产。
答案 6 :(得分:1)
不要在应用程序中安排比在底层硬件上拥有核心更多的线程。请记住,操作系统将需要线程执行,并且可能需要共享相同硬件的其他服务,因此可能需要使用您的应用程序以使用少于最大可用内核数。
答案 7 :(得分:1)
答案 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等非常有效。