当前位置:首页 > 内存 > 正文

内存溢出怎么查及解决

  • 内存
  • 2024-08-29 03:55:03
  • 3255

一、内存溢出的几种原因和解决办法内存溢出是指应用系统中存在不可恢复的内存或者使用了过多的内存,最终导致程序需要的内存超过了虚拟机能够提供的最大内存。
加载到内存的数据量太大,例如B.同时从数据库中检索太多数据。集合类中有对象的引用,使用JVM回收后不会被删除;代码中有无限循环或循环。用于启动参数的存储值太小。
检查数据库查询中是否立即存在检索所有数据的查询。一般来说,当十万条记录同时取入内存时,就会发生内存溢出。这个问题比较隐蔽,因为数据库数据较少,不太容易出问题。上线后,数据库数据较多,单次查询就可能导致内存溢出。因此,尝试使用分页进行数据库查询。
检查代码是否包含无限循环或递归调用。


二、OOM内存溢出解决方案之一,“流式查询”!面对物流行业月初出现的内存溢出问题,解决方案之一就是采用流式查询技术。每个socket每月的运行数据量非常巨大,单次加载到内存就可能导致内存溢出。解决策略是避免一次性加载所有数据,而是结合分页查询和硬盘存储。通过Mybatis流式查询,查询结果以迭代器的形式返回,并一一获取,显着减少内存占用。
流式查询的实现包括将逻辑写入mapper的映射文件,在接口文件中添加selectFetchSize方法,以及自定义ResultHandler接口来处理游标中的数据。业务逻辑层调用流式查询方法逐条获取数据,减少内存负载。另外,将硬盘空间替换为内存空间,使用Redisson信号量限流来控制报表生成请求数量,并使用MQ解耦和微服务拆分来进一步优化性能和同时处理。
虽然流式查询是解决OOM问题的有效策略,但还有其他方法,例如分页查询、功率限制和解耦等。总的来说,通过这些方法的综合应用,可以有效避免月初和财务端出现内存溢出问题。未来将分享更多解决方案。