【发布时间】:2019-12-18 19:02:46
【问题描述】:
在我们的一个 java 应用程序中,我们有很多协议缓冲区类,并且 jar 本质上公开了一个接口,其中一个方法由另一个应用程序使用。我们注意到,第一次调用此方法时,调用时间相当长(>500ms),而随后的调用要快得多(
这在另一个应用程序中得到了进一步证实,该应用程序的工作方式完全不同 - 但也使用协议缓冲区 - 表现出相同的行为。此外,我们尝试在启动时为所有 proto 缓冲区类创建一个虚拟实例 (XY.newBuilder().build()),我们添加的每个类都可以注意到第一次调用下降的开销。
在 .NET 中,我可以找到另一个显示类似问题的问题 (Why is ProtoBuf so slow on the 1st call but very fast inside loops?),但是那里的解决方案似乎特定于带有预编译序列化程序的 C#。到目前为止,我在 Java 中找不到相同的问题。是否有类似上述问题中所示的适用于 java 的解决方法?
【问题讨论】:
-
我想延迟发生是因为 JVM 需要加载新类。你可以开启类加载日志看看是不是真的。
-
这是个好主意,我会尽快启用详细类加载,看看这是否证实了我的怀疑。
标签: java protocol-buffers