【问题标题】:Spring Data JPA Meta JpaMetamodelMappingContext Memory ConsumptionSpring Data JPA Meta JpaMetamodelMappingContext 内存消耗
【发布时间】:2018-09-18 11:49:50
【问题描述】:

我的 Spring Data JPA/Hibernate 应用程序在启动时消耗了超过 2GB 的内存,而没有一个用户点击它。我使用 Hazelcast 作为二级缓存,但是当我使用 ehCache 时也遇到了同样的问题,所以这可能不是问题的原因。

我在 Visual VM 中运行了一个带有堆转储的配置文件,我看到了 JpaMetamodelMappingContext 消耗了大量内存的位置,以及大量的 Map 对象。我只需要帮助来破译我所看到的以及这是否真的是一个问题。我的模型中有一百个类,所以这可能是正常的,但我没有参考点。好像有点过分了。

一旦负载 100 个并发用户,我的内存消耗会增加到 6-7 GB。这对于我推送和缓存的数据量来说是很正常的,但我觉得如果我可以减少初始内存,我会有更多的增长空间。

【问题讨论】:

    标签: spring hibernate spring-data-jpa hazelcast


    【解决方案1】:

    我认为你在这里没有问题。 相反,我认为您误解了您正在查看的数据。

    注意堆空间图显示两个数字:Heap sizeUsed heap

    堆大小(橙色)是 JVM 可用于堆的内存量。 这意味着它是 JVM 在某个时间点向操作系统请求的数量。

    Used heapHeap size中实际使用的部分。 忽略启动阶段,它会线性增长,然后随着时间的推移反复下降。 这是空闲应用程序的典型行为。 应用程序的某些部分会产生适量的垃圾(曲线的上升部分),这些垃圾会不时被收集。

    该曲线的低点是您实际使用的内存量。 似乎是 250MB 左右,这对我来说听起来并不多,尤其是当您说实际工作时的 6-7GB 总消耗量对您来说听起来很合理时。

    其他一些观察:

    CPU 负载和堆在启动时都会快速增长/波动很大。 这是意料之中的,因为对存储库和实体的分析发生在那个时候。

    JpaMetamodelMappingContext 的保留大小约为 23MB。 再次,一大块内存,但不是那么大。 这包括它引用的内容,几乎完全是来自 JPA 实现的元数据,您可以在 take a look at its source 时轻松看到。

    【讨论】:

    • 无论多长时间,它都是空闲的,使用量永远不会低于 2gb 的内存。你会认为它会变得比这低得多。我没有在内存中存储任何东西,缓存是短暂的。
    • 不确定你在说什么。每个 GC 周期的使用量下降到 250-300MB。
    • 在我的应用程序中,即使长时间处于空闲状态,我也从未看到内存消耗降至 2gb 以下。
    • Jens 试图告诉您的是,您的应用程序正在从系统中保留 2Gb,因为在启动时他需要它。在初始工作负载之后,垃圾收集器负责减少所需的内存,但 jvm 足够聪明,可以保留 2Gb,因为以后可能会需要它。从系统视图来看,Jvm 一直在使用 2Gb,但实际上只使用了 300 mb。
    猜你喜欢
    • 2020-11-23
    • 2018-05-05
    • 2019-01-16
    • 2017-11-22
    • 2015-10-06
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多