记一次java.lang.OutOfMemoryError

发布网友 发布时间:2024-10-23 21:01

我来回答

1个回答

热心网友 时间:9分钟前

系统在执行测试build2时,遇到web服务崩溃问题。崩溃原因:java.lang.OutOfMemoryError: Java heap space。问题主要发生在获取大量过期gps数据时,内存资源耗尽,导致系统无法正常响应。此问题通过手动重启得以解决。

错误日志显示,内存耗尽发生在tomcat中,配置的堆内存大小为1G。夜间,由于gps长时间未更新,系统需向前端推送约2000个gps点位信息,频率为10秒一次。考虑到查询时只保留device_index和type两个字段,预期gc不会引发内存压力。然而,推测可能存在内存泄露现象。

利用Eclipse MAT分析hprof文件,发现内存使用量达到748M。进一步分析,发现内存主要驻留在一个ConcurrentHashMap中。该map内包含37512个实体,对应于程序中sessionHolder的map。在代码中,仅在websocket连接时插入map,而未在断开时移除websocket连接。结果,session在内存中持续存在,导致内存占用持续增长。

当jvm执行垃圾回收时,判断对象被引用而未释放,导致对象无法被回收,最终导致内存使用量增加直至超出限制。在基线测试中,由于用户访问量小,很少有websocket断开重连的情况,且1G堆空间足够大,导致此问题未被发现。

在测试环境中,频繁创建websocket连接时,观察到jvm堆使用量增加,强制执行gc时内存并未被回收。为解决此问题,应确保在websocket断开时,从sessionHolder中移除对象。此措施能帮助jvm顺利回收堆内存,防止内存泄露问题。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com