5

我最近将我的 REST API 从 Jersey 1 迁移到 Jersey 2(准确地说是 2.22.1)。该应用程序作为 Spring Boot 应用程序运行。该应用程序接收到相当大的流量。我使用 JMC(Java Mission Control)对应用程序进行了概要分析,并注意到 Annotations ( ) 消耗了大量内存getEntityAnnotations()。jms屏幕截图中的更多详细信息:

jms 截​​图

从屏幕截图中您可以看到 312 个Annotation[]对象拥有 1.55 GB 的内存(每个数组约 5 MB)。我在方法中有断点getEntityAnnotations()并观察到Annotation[]只包含 3 个注释(HTTP 方法、路径和消耗)。Annotation 对象只有几个字段。我无法解释这些字段很大的原因。调试器屏幕截图中的更多详细信息:

调试器截图

有没有人遇到过类似的问题?

此外,从 jms 屏幕截图中,我们可以观察到一半的内存来自Arrays.copyOf. 这是因为类getEntityAnnotations()中的方法OutboundMessageContext克隆了entityAnnotations数组。这个特定的实现已作为票证JERSEY-2072的一部分添加到球衣 2.5 中。

我正在使用 Java 1.8.0_60 和 spring boot 1.3.2.RELEASE。如果您需要有关应用程序或环境的任何其他详细信息,请告诉我

4

0 回答 0