我最近将我的REST API从Jersey 1迁移到Jersey 2(确切地说是2.22.1)。该应用程序作为春季启动应用程序运行。该应用程序收到相当大的流量。
我使用JMC(Java Mission Control)分析了应用程序,并注意到Annotations(getEntityAnnotations()
)消耗了大量内存。 jms截图中的更多细节:
从屏幕截图中可以看到312 Annotation[]
个对象拥有1.55 GB内存(每个阵列约5 MB)。我在getEntityAnnotations()
方法中有断点,并观察到Annotation[]
仅包含3个注释(HTTP方法,路径和消耗)。 Annotation对象只有几个字段。我无法解释大字段的原因。调试器屏幕截图中的更多细节:
有没有人遇到过类似的问题?
此外,根据jms屏幕截图,我们可以观察到一半的内存来自Arrays.copyOf
。这是因为getEntityAnnotations()
类中的OutboundMessageContext
方法克隆了entityAnnotations
数组。这个特殊的实现已添加到球衣2.5中,作为球票JERSEY-2072的一部分。
我正在使用Java 1.8.0_60和spring boot 1.3.2.RELEASE。 如果您需要有关应用程序或环境的任何其他详细信息,请与我们联系