gpt4 book ai didi

spring - HazelCast IMap.values() 在 Tomcat 上给出 OutofMemory

转载 作者:行者123 更新时间:2023-11-28 22:30:08 24 4
gpt4 key购买 nike

我仍在尝试了解 hazelcast,并且必须决定是否使用它。

我编写了一个简单的应用程序,其中我在(单节点)服务器启动时启动缓存并同时加载具有大约 400 个条目的 map 。对象本身有两个字符串字段。我有一个查找缓存并尝试从 map 中获取所有值的服务类。

但是,在尝试从 hazelcast 映射中获取值时,我在 Java 堆空间上遇到了 OutofMemoryError。最终,我们计划开始迁移到 5 节点集群。

缓存spring配置如下:

<hz:hazelcast id="instance">
<hz:config>
<hz:group name="dev" password=""/>


<hz:properties>
<hz:property name="hazelcast.merge.first.run.delay.seconds">5</hz:property>
<hz:property name="hazelcast.merge.next.run.delay.seconds">5</hz:property>
</hz:properties>

<hz:network port="5701" port-auto-increment="false">
<hz:join>
<hz:multicast enabled="true" />
</hz:join>
</hz:network>
</hz:config>
</hz:hazelcast>
<hz:map instance-ref="instance" id="statusMap" name="statuses" />

以下是错误发生的地方:

map = instance.getMap("statuses");
Set<Status> statuses = (Set<Status>) map.values();

return statuses;

IMap 的任何其他方法都可以正常工作。我尝试获取 keySet 和 size 并且都工作正常。只有当我尝试获取 OutofMemory 错误的值时才会出现。

java.lang.OutOfMemoryError: Java heap space

我已经用一个独立的 Java 应用程序尝试了上面的方法,它工作正常。我还使用可视化 VM 进行了监视,并且在发生错误时没有看到已用堆内存出现任何峰值,这更加令人困惑。 Available Heap为1G,发生错误时已用Heap约为70MB。

但是,当我从应用程序中取出缓存实现时,它可以正常进入数据库并获取数据。

我也试过使用 tomcat vm args 但没有成功。当我使用或不使用 SQLPredicate 访问 IMap.values() 时,它都是相同的 OutofMemoryError。在此问题上的任何帮助或指导将不胜感激。

谢谢。

最佳答案

正如异常所提到的,由于 values 方法试图一次返回所有反序列化的值,因此堆空间已用完。如果它们不适合内存,您可能会遇到 OOME。

您可以使用分页来防止这种情况发生:http://hazelcast.org/docs/latest/manual/html-single/hazelcast-documentation.html#paging-predicate-order-limit-

关于spring - HazelCast IMap.values() 在 Tomcat 上给出 OutofMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23373974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com