因为内存溢出,我差点被优化

我们都知道,在写代码的过程中,业务逻辑很大程度上决定了你对业务的理解,但是解决问题,却是你提升比较关键的地方,而我,却差点因为这个内存溢出,把自己给干优化掉。

什么是内存溢出

百度百科是这么解释的:

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免

其实很简单,在 Java 中,那就是 Out Of Memory,导致了不合理的 GC ,那么如何去定位这个内存溢出的呢?实际上如果是大公司,那么会有专业的运维人员去定位哪些程序导致了内存溢出,但是如果要是没有专业的运维人员,那么你自己就得学会怎么去定位这个内存溢出了。

如何定位内存溢出

(一)定位占用CPU最高的服务

1、先找到cpu占用比较高的进程:top -c 进去后按Shift+P键

一般异常的进程cpu的占用会很高,记录下这进程的PID

2、查看指定进程cpu情况:top -cp PID

查看此进程占用cpu最高的线程,记录下线程的ppid也可以将相关信息保存下来:top -Hp PID -o %CPU -n 1 >cpu.txt到此,我们就找到的最占用cpu的进程以及相关线程。

3、如果你已经知道是你们的 Java 程序导致了内存溢出,那么我们就得学会分析日志,一般在 Out Of Memory 的上方,我们都会有各种日志的输出,来标志现在这个时间点,我们的程序执行了什么操作,导致了我们的这个内存溢出,分析到这里,就轮到看代码了。

检查的内容大致都有哪些地方呢?

在一个项目中,使用两个数据库连接,其中专用于发送短信的数据库连接使用 DBCP 连接池管理,用户为不将短信发出,有意将数据库连接用户名改错,使得日志中有许多数据库连接异常的日志,一段时间后,就出现 OutOfMemory 错误。经分析,这是由于 DBCP 连接池 BUG 引起的,数据库连接不上后,没有将连接释放,最终使得D BCP 报OutOfMemory 错误。

上面这是一个简单的例子,比如还有其他的,代码中是否有死循环或递归调用。是否有大循环重复产生新对象实体。检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

比如我们这次内存溢出,就是因为一个很简答的导入功能,因为服务器给服务拆分的内存只有2G,而程序也没有专门的去处理,实施导入数据的时候,直接把100w的空数据从Excel中直接导入了,结果,直接导致了内存溢出。那么我们应该怎么去处理这个呢?

其实我们的比较简单,就是直接限定了文件的大小,因为Excel 虽然很大,但是有数据量的就那么几百行,100w行,都是空行数据,还都识别了,所以处理方式就那么几种,限制文件大小,限制读取数据的时候不读空行,因为毕竟内存大小是已经不允许我们做修改了,只能通过这个代码业务层面来处理这个了。

如何解决内存溢出呢?

内存溢出的解决方案:

  • 第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
  • 第二步,检查错误日志,查看OutOfMemory错误前是否有其它异常或错误。
  • 第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

重点排查以下几点:

1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

2.检查代码中是否有死循环或递归调用。

3.检查是否有大循环重复产生新对象实体。

4.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

  • 第四步,使用内存查看工具动态查看内存使用情况

图片

一般的,使用的工具有很多,MAT(Memory Analyzer Tool) 这个工具是一个比较好用的分析内存的工具,还有 jmeter 这个压力测试工具,可对特定接口进行压测,分析tps、响应时间、CPU、内存等性能指标。

JConsole、JVisualVM jdk 自带可视化工具,可监控CPU、内存、线程等状况。

企业系统开发工具

JNPF开发平台,很多人都用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

原理是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。

官网:https://www.jnpfsoft.com/?csdn ,如果你有闲暇时间,可以做个知识拓展。

这是一个基于Java Boot/.Net Core构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,满足快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3。

为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/115101.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《金字塔原理》阅读笔记

我们都希望在思考、沟通交流和解决问题时,重点突出,思路清晰,层次分明。我们评价人时,有一个标准是逻辑思维能力,而逻辑思维能力的标准又是什么?我们指导别人“要逻辑清晰、条理分明”,可怎样才…

Postman应用——接口请求和响应(Get和Post请求)

文章目录 新增Request请求Get请求Post请求 Request请求响应Postman响应界面说明请求响应另存为示例(模板)Postman显示的响应数据清空请求响应数据保存到本地文件 这里只讲用的比较多的Get和Post请求方式,也可以遵循restful api接口规范&#…

服务器时间正常,docker容器日志显示时间少了8小时

问题: 项目中docker部署的项目容器日志时间少了8小时。解决: 在Dockerfile添加下面语句: # 设置时区 ENV TZ"Asia/Shanghai"

4年测试工作经验,跳槽之后面试20余家公司的总结

先说一下自己的个人情况,普通二本计算机专业毕业,懂python,会写脚本,会selenium,会性能,然而离职后到今天都没有收到一份offer!一直在待业中,从离职第一天就开始准备简历&#xff0c…

Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache,lsof)命令

1、什么是buffer/cache ? buffer/cache 其实是作为服务器系统的文件数据缓存使用的,尤其是针对进程对文件存在 read/write 操作的时候,所以当你的服务进程在对文件进行读写的时候,Linux内核为了提高服务的读写速度,则将…

记录一次DLL分析实战

记录一次DLL分析实战 1.VT查看分析报告2.判断文件是否加壳3.查看导入函数4.查看是否有任何其他文件或基于主机的迹象5.使用工具IDA Pro进行字符串分析 1.VT查看分析报告 virustotal 全绿,没有报毒: 可以看到这个dll是32位的: 下面可以看它调…

MyEclipse 用tomcat部署SSM项目后,项目名称和当前项目不一致

MyEclipse 用tomcat部署SSM项目后,项目成功启动,但是访问所有接口报404 从这里可以看到,部署的项目名为accurate_sugar_control_yc_api,但实际我们项目名字应该为accurate_sugar_control_otc_api 解决办法 在本地找到项目的根目…

TQ210-Bootloader-Uboot(LTS)

Bootloader的作用 Bootloader是位于计算机系统启动过程中的程序,它的主要作用是将操作系统从磁盘等外部存储介质加载到计算机内存中,并启动操作系统执行。Bootloader通常包括硬件初始化、自检、异常处理和启动操作系统等功能。它是计算机系统中非常重要…

shiro

shrio笔记 认证 授权 JWT简介&#xff08;Json Web Token) 1、导入依赖库 <!--shiro--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.5.3</version></dependency>…

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…

聊一聊Twitter的雪花算法

什么是Twitter的雪花算法方法&#xff1f; 这是一种在分布式系统中生成唯一ID的解决方案。Twitter在推文、私信、列表等方面使用这种方法。 •ID是唯一且可排序的•ID包含时间信息&#xff08;按日期排序&#xff09;•ID适用于64位无符号整数•仅包含数字值 符号位&#xff08…

【方案】智慧养殖:浅谈视频监控与AI智能识别技术助力奶牛高效智慧养殖

一、方案背景 随着科技的飞速发展&#xff0c;智能化养殖逐渐成为现代畜牧业的发展趋势。人工智能技术、物联网、视频技术、云计算、大数据等新兴技术&#xff0c;正在为奶牛养殖业带来全新的变革。越来越多的牧场、养殖场开始运用新技术来进行智能监管、提高生产效率、降低生…