我的Spring Data JPA / Hibernate应用程序在启动时消耗了超过2GB的内存,而没有一个用户点击它。我将Hazelcast用作二级缓存,但是当我也使用ehCache时,我遇到了同样的问题,所以这可能不是问题的原因。
我在Visual VM中运行了带有堆转储的配置文件,我看到JpaMetamodelMappingContext和第二个Map对象占用了大部分内存。我仅需要帮助才能理解我所看到的内容,如果这确实是一个问题。我的模型中确实有一百个类,所以这可能很正常,但是我没有任何参考。似乎有点过分。
一旦负载为100个并发用户,内存消耗将增加到6-7 GB。对于我要推送和缓存的数据量来说,这是很正常的,但是我觉得如果我可以减少初始内存,那么我会有更大的增长空间。
答案 0 :(得分:7)
我认为您在这里没有问题。 相反,我认为您误解了所查看的数据。
请注意,堆空间图显示两个数字:堆大小和已用堆
堆大小(橙色)是JVM可用于堆的内存量。 这意味着JVM在某个时候从操作系统请求的数量。
已用堆是实际使用的堆大小的一部分。 忽略启动阶段,它会线性增长,然后随时间反复下降。 这是空闲应用程序的典型行为。 该应用程序的某些部分会生成适量的垃圾(曲线的上升部分),这些垃圾会不时被收集。
该曲线的最低点是您实际使用的内存量。 似乎大约有250MB,这对我来说听起来不是很多,尤其是当您说实际工作时6-7GB的总消耗对您来说合理时。
其他一些观察结果:
在开始时,CPU负载和堆都快速增长/波动很大。 这是可以预期的,因为存储库和实体的分析是在那时进行的。
JpaMetamodelMappingContext
的保留大小约为23MB。
再说一遍,虽然内存很大,但不是很大。
其中包括它引用的内容,几乎是JPA实现中的元数据,您在take a look at its source时可以很容易地看到。