您应该预热代码的哪些部分?
通常,您无需执行任何操作。但是,对于低延迟应用程序,您应该预热系统中的关键路径。你应该有单元测试,所以我建议你在启动时运行这些来预热代码。
即使你的代码预热了,你也必须确保你的 CPU 缓存也保持温暖。在阻塞操作(例如网络 IO)后,您可以看到性能显着下降,最长可达 50 微秒。通常这不是问题,但如果您大部分时间都试图保持在 50 微秒以下,那么大多数情况下这将是一个问题。
注意:预热可以让 Escape Analysis 启动并将一些对象放在堆栈上。这意味着不需要优化此类对象。最好在优化代码之前对应用程序进行内存分析。
即使我预热了代码的某些部分,它还能保持多久(假设这个术语只意味着你的类对象在内存中保持多长时间)?
没有时间限制。这取决于 JIt 是否检测到它在优化代码时所做的假设是否不正确。
如果我有需要在每次收到事件时创建的对象,它有什么帮助?
如果您想要低延迟或高性能,您应该创建尽可能少的对象。我的目标是产生低于 300 KB/秒的速度。使用此分配率,您可以拥有一个足够大的 Eden 空间,以便每天进行一次次要收集。
考虑一个示例,该应用程序预计将通过套接字接收消息,并且事务可能是新订单、修改订单和取消订单或交易确认。
我建议你尽可能地重复使用对象,但如果它在你的分配预算之内,它可能不值得担心。
请注意,该应用程序是关于高频交易 (HFT) 的,因此性能非常重要。
您可能对我们用于不同投资银行和对冲基金的 HFT 系统的开源软件感兴趣。
http://chronicle.software/
我的生产应用程序用于高频交易,每一点延迟都可能是一个问题。很明显,在启动时如果你不预热你的应用程序,它会导致几毫秒的高延迟。
特别是您可能对https://github.com/OpenHFT/Java-Thread-Affinity感兴趣,因为该库可以帮助减少关键线程中的调度抖动。
并且据说需要预热的代码的关键部分应该运行(使用假消息)至少 12K 次,以便它以优化的方式工作。为什么以及如何工作?
代码是使用后台线程编译的。这意味着即使一个方法可能有资格编译为本机代码,但这并不意味着它已经这样做了,尤其是在编译器已经很忙的启动时。12K并非不合理,但可能会更高。