我的Spring Data JPA/Hibernate应用程序在启动时消耗了超过2 2GB的内存,没有一个用户访问它。我使用Hazelcast作为二级缓存,但当我使用ehCache时,我也遇到了同样的问题,所以这可能不是问题的原因。
我在Visual VM中运行了一个带有堆转储的配置文件,我看到JpaMetamodelMappingContext和辅助内存消耗了大量的Map对象。我只是需要帮助来破译我所看到的,如果这真的是一个问题。我在模型中确实有100个类,所以这可能是正常的,但我没有参考点。这看起来有点过分了。
一旦我获得100个并发用户的负载,我的内存消耗就会增加到6-7 GB。对于我推送和缓存的数据量来说,这是很正常的,但我觉得如果我能减少初始内存,我就会有更大的增长空间。


发布于 2018-09-30 20:34:42
我不认为你有什么问题。相反,我认为您曲解了您正在查看的数据。
请注意,堆空间图显示两个数字:堆大小和已用堆
堆大小(橙色)是JVM可用于堆的内存量。这意味着它是JVM在某个时刻从OS请求的量。
已用堆是实际使用的堆大小的一部分。忽略启动阶段,它会线性增长,然后随着时间的推移反复下降。这是空闲应用程序的典型行为。应用程序的某些部分会生成适中数量的垃圾(曲线的上升部分),这些垃圾会不时地被收集。
该曲线的低点是实际使用的内存量。它似乎大约是250MB,这对我来说听起来并不是很多,特别是当你说实际工作时6-7 7GB的总消耗对你来说是合理的。
其他一些观察结果:
CPU负载和堆在启动时都增长很快/波动很大。这是意料之中的,因为存储库和实体的分析是在那个时候发生的。
JpaMetamodelMappingContext的保留大小约为23MB。再说一次,这是一个很好的内存块,但不是那么大。这包括它引用的内容,这些内容几乎完全是来自JPA实现的元数据,当您使用take a look at its source时,您可以很容易地看到这一点。
https://stackoverflow.com/questions/52385956
复制相似问题