当前位置: 首页 > 知识库问答 >
问题:

在Tomcat上提供OutofMemory的HazelCast imap.values()

羊舌兴德
2023-03-14

我还在努力了解hazelcast,还得做出是否使用它的决定。

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

但是,当我试图从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的任何其他方法都可以正常工作。我试着把钥匙套和尺寸都弄好了。只有当我尝试获取值时,OutofMemory错误才会出现。

java.lang.OutOfMemoryError: Java heap space

我已经用一个独立的java应用程序尝试了上面的方法,它工作得很好。我还使用visual VM进行了监视,当错误发生时,在使用过的堆内存中没有看到任何尖峰,这就更加令人困惑了。发生错误时,可用堆为1G,使用的堆约为70MB。

多谢了。

共有1个答案

鄢选
2023-03-14

正如异常所提到的,由于values方法尝试一次返回所有反序列化的值,因此堆空间不足。如果它们不适合记忆,你可能会得到一个Oome。

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

 类似资料:
  • 我试图在docker容器上运行我的java应用程序。我在本地使用tomcat服务器,它工作正常。我是java/tomcat/docker的新手,所以我可能会错过一些非常简单的东西,但我认为只要将我的本地war文件指向就足够了。 这是我的docker-compose.yml 我可以看到文件,但我无法访问我的应用程序。我的本地主机仍然显示tomcat页面,而不是从本地安装的tomcat运行时看到的“H

  • 我有一个LDAP服务器正在运行。使用的LDAP服务是OpenDJ的。 现在发生的是,这台机器上的目录管理器服务正在使用java。lang.OutOfMemoryError 关于获取目录管理器服务的线程转储,下面是我们得到的 线t@883:(状态=阻塞)-太阳。杂项。不安全的park(boolean,long)@bci=0(编译帧;信息可能不精确)-java。util。同时发生的锁。锁支架。park

  • 我的Spring Boot应用程序在本地安装的Tomcat服务器上运行良好。但是当我将相同的WAR部署到弹性豆茎并单击给定的URL时,我得到的只是404。在我的Spring Boot应用程序中没有指定的路由在这里工作。可能的原因是什么? server.port=5000

  • 问题内容: 在有关类的Spring javadoc文章中,该类非常简单,建议使用 使用容器提供的JNDI数据源。这样DataSource可以通过DataSourceSpring ApplicationContext中的bean 形式公开。 问题是:我该如何完成? 例如,如果我希望让访问我的自定义MySQL数据库,那我需要什么?我应该在上下文配置等中写些什么? 问题答案: 如果使用基于Spring

  • 我在Tomcat前面有Nginx,但proxy_pass静态文件不提供。这是我的配置: 如果我去https://example.com我得到的Tomcat应用程序没有CSS,没有图片。 从错误中恢复。日志

  • 单数据库MySql 多个Tomcat位于不同的位置,共享相同的代码 Hibernate5.2.2 在桌面上 @GenericGenerator(name=“employee”,strategy=“increment”) @GeneratedValue(generator=“employee”) 当其他服务器输入值时,出现重复主键错误 将来,我们还支持Sql Server、Oracle、HSQL