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

内存溢出排查思路

  • 内存
  • 2024-08-13 09:11:01
  • 6092

一、nginx检查配置内存溢出nginx检查配置堆溢出是程序使用不可靠的方式访问/复制缓冲区。故障排除方法:
1.在终端中输入top。
2。检查服务器存储是否已达到最大。


二、内存溢出和内存泄漏的区别,产生原因以及解决方案内存溢出OutOfMemory是指程序使用内存时,没有足够的内存空间可以使用,发生OutOfMemory例如,如果使用了一个整数,但是里面可以存储长度,那么就是内存溢出。
内存泄漏是指程序在申请内存后无法释放所分配的内存空间。内存泄漏的危害可以忽略不计,但是内存泄漏积累的后果很严重或者以后会被占用。
内存最终会导致内存不足!
内存溢出是指你请求分配的内存超出了系统所能给你的,系统无法满足请求,从而发生溢出。
内存泄漏是指您要求系统分配内存以供使用(新建),但使用后不归还(删除)。结果,你无法再访问你请求的内存(也许你丢失了它的地址),系统也无法再次将它分配给它需要的程序。一个盘子只能装4个水果,无论如何你把5个水果放在上面,但它们掉到地上,不能吃。这已经满溢了!例如,如果在栈满时进栈,就会发生空间溢出,称为下溢;如果在栈空时进栈,就会发生空间溢出,称为下溢。即分配的内存不足以存储一系列数据项,称为内存溢出。
按照发生方式分类,内存泄漏可分为4类:
1.频繁的零星内存泄漏。存在内存泄漏的代码会被执行多次,每次执行都会造成内存泄漏。
2.偶尔会出现内存泄漏。导致内存泄漏的代码只会在某些条件或操作下发生。频繁和偶发是相对的。在某些情况下,偶尔发生的事情可能会成为常态。所以测试环境和测试方法对于检测内存泄漏很重要。
3.内存泄漏。导致内存泄漏的代码只会执行一次,或者由于算法缺陷,总会有且只有一个内存块泄漏。例如,如果在类的构造函数中分配了内存,但在析构函数中没有释放内存,则内存泄漏只会发生一次。4.隐式内存泄漏。程序在运行时不断分配内存,但在运行结束之前不会释放内存。严格来说,这里不存在内存泄漏,因为程序最终会释放所有请求的内存。但对于需要运行数天、数周或数月的服务器程序来说,未能及时释放内存也可能导致最终耗尽所有系统内存。因此,我们将这种类型的内存泄漏称为隐式内存泄漏。
从使用程序的用户角度来看,内存泄漏本身不会造成任何危害,作为普通用户,他们根本不会感觉到内存泄漏的存在。真正危险的是内存泄漏的累积,最终会耗尽所有系统内存。从这个角度来看,一次性内存泄漏是无害的,因为它们不会累积,而隐式内存泄漏则非常危险,因为它们比重复和零星的内存泄漏更难以检测
内存泄漏的原因和解决方案内存溢出
造成内存溢出的原因有很多,编辑器会列出以下常见的:
1内存中加载的数据量太大,比如一次从数据库取的数据过多;
2.集合类中有对象的引用,使用后没有清空,导致JVM无法回收;
3.代码中存在无限循环或者循环生成过多的重复对象实体;
4使用的第三方软件存在BUG;
5初始化参数内存值设置太小
解决办法内存溢出:第一步,修改JVM启动参数,继续加大内存。(不要忘记添加-Xms和-Xmx参数。)
第二步是检查错误日志,看看在“OutOfMemory”错误之前是否有任何异常或其他错误。
第三步是检查和分析代,找出哪里可能发生内存溢出。
重点关注以下几点:
1.检查数据库查询中是否有一次性获取所有数据的查询。一般来说,如果一次取10万条记录到内存中,就会导致内存溢出。这个问题比较隐蔽,上线前,数据库数据较少,不太容易出问题。上线后,数据库数据较多,单次查询可能会导致内存溢出。所以尝试使用分页进行数据库查询。
2检查代码中是否存在无限循环或递归调用。
3检查是否存在大循环,重复生成新的对象实体。4.检查数据库查询中是否有一次性获取所有数据的查询。一般来说,如果一次取10万条记录到内存中,就会导致内存溢出。这个问题比较隐蔽,上线前,数据库数据较少,不太容易出问题。上线后,数据库数据较多,单次查询可能会导致内存溢出。因此尝试使用分页进行数据库查询。5.检查列表和地图等集合对象在使用后是否未清理。Lists和MAP等集合对象将始终拥有对该对象的引用,从而使这些对象不可被GC回收。
第四步,使用内存查看工具查看动态内存使用情况。