|
1
30
爪哇的“热身”通常有两件事: (1):延迟类加载:这可以通过强制加载来解决。 这样做的简单方法是发送一条假消息。您应该确保假消息将触发对类的所有访问。对于exmaple,如果您发送一条空消息,但是您的程序将检查消息是否为空,并避免执行某些操作,那么这将不起作用。 另一种方法是在程序启动时通过访问类来强制初始化类。 (2)实时优化:在运行时,Java VM将优化代码的某些部分。这就是为什么有一个预热时间的主要原因。 为了缓解这个问题,您可以发送大量假消息(但看起来是真实的),这样优化就可以在用户使用它之前完成。 另一个可以帮助您缓解这一问题的方法是支持内联,例如尽可能多地使用私有和最终版本。原因是,VM不需要查找继承表来查看实际要调用的方法。 希望这有帮助。 |
|
|
2
14
您的问题不是类加载,而是“及时”编译。
尝试
这将迫使Java在第一次运行时编译所有的东西。它会稍微降低代码的启动速度,但不会降低VM代码(因为在安装Java时会编译)。有一个漏洞允许Java以类似的方式编译定制的JAR,并将结果保存在以后的执行中,这将大大减少开销,但是没有任何压力来很快修复这个bug。 第二种选择是向应用程序发送5000条假消息来“预热”。将其作为“确保所有设置正确”出售。 [编辑]预编译类中的一些背景信息: Class Data Sharing 您可能想尝试IBM的Java版本,因为在这里,您可以向共享池添加更多类: Overview of class data sharing [编辑2] 回答 kittylyst :这确实会很快用只使用一次的方法填满代码缓存。它甚至可能使你的整个应用程序变慢。 如果将其设置为较低的值,应用程序的启动时间可能会变得非常慢。这是因为运行编译代码的JIT优化+比在解释模式下运行一次代码的成本更高。 这里的主要问题是代码仍然是“及时”编译的。只要你不能运行每一个你需要的方法至少一次,应用程序将“打嗝”几毫秒,每次遇到一些尚未编译过的东西。 但是如果你有RAM,你的应用程序很小,或者你可以增加代码缓存的大小,你不介意启动时间太慢,你可以尝试一下。一般来说,默认设置相当好。 |
|
|
3
6
只需在系统向真正的客户流量开放之前,通过系统运行一系列禁止操作的消息。通常是10千条信息。 对于金融应用程序(例如fix),这通常是通过在它打开之前向市场发送订单(价格远离昨晚的收盘价,以防万一)来完成的。他们都会被拒绝,但这无关紧要。 如果您使用的协议是自制的,那么下次升级它的库时,请添加对“预热”、“测试”或“sanitycheck”消息类型的显式支持。 当然,这可能不会编译应用程序逻辑特定的路径,但在一个体面的消息传递应用程序中,处理网络流量的部分几乎肯定是堆栈的主要部分,因此这并不重要。 |
|
|
4
3
您使用的是客户机还是服务器JVM?尝试启动程序时使用:
在这种模式下运行Sun的JVM时,JIT会更早地将字节码编译为本机代码;因此,程序启动将花费更长的时间,但之后运行会更快。 参考文献: Frequently Asked Questions About the Java HotSpot VM 报价:
|
|
|
5
3
如果在当代硬件(每个CPU有2个或更多内核)和最新版本的JDK上以Hotspot的服务器模式运行,则可以使用以下选项加速预热: -server -XX:+TieredCompilation |
|
|
6
2
我知道,这是老线索,但我在网上找到的:
现在你知道该怎么做了。 |
|
|
7
-4
似乎您的项目将受益于实时保证: |
|
|
wahyu · 云消息API(旧版)已禁用[重复] 1 年前 |
|
|
Aman Sharma · 无法从mesibo中的组中删除成员 2 年前 |
|
|
littleK · RabbitMQ扇出交换机故障 12 年前 |
|
|
littleK · 使用ActiveMQ获得比RabbitMQ更好的性能 13 年前 |