内存溢出

news/2024/7/20 13:46:16 标签: 数据库, 内存管理, java

 

java语言为例

引起内存溢出的原因有很多种,常见的有以下几种:
 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
 代码中存在死循环或循环产生过多重复的对象实体;
 使用的 第三方软件中的 BUG;
 启动参数设定的过小;
 
解决办法
内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决。
第一步,就是修改 JVM启动参数,直接增加内存。这一点看上去似乎很简单,但很容易被忽略。JVM默认可以使用的内存为64M,Tomcat默认可以使用的内存为128 MB,对于稍复杂一点的系统就会不够用。在某项目中,就因为启动参数使用的默认值,经常报“OutOfMemory”错误。因此,-Xms,-Xmx参数一定不要忘记加。
第二步,检查 错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。在一个项目中,使用两个数据库连接,其中专用于发送短信的数据库连接使用DBCP 连接池管理,用户为不将短信发出,有意将数据库连接用户名改错,使得日志中有许多数据库连接异常的日志,一段时间后,就出现“OutOfMemory”错误。经分析,这是由于DBCP连接池BUG引起的,数据库连接不上后,没有将连接释放,最终使得DBCP报“OutOfMemory”错误。经过修改正确数据库连接参数后,就没有再出现内存溢出的错误。
查看日志对于分析内存溢出是非常重要的,通过仔细查看日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块。
第三步,安排有经验的编程人员对代码进行走查和分析,找出可能发生内存溢出的位置。重点排查以下几点:
 检查代码中是否有死循环或 递归调用。
 检查是否有大循环重复产生新对象实体。
 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用 分页的方式查询。
 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况。某个项目上线后,每次系统启动两天后,就会出现内存溢出的错误。这种情况一般是 代码中出现了缓慢的内存泄漏,用上面三个步骤解决不了,这就需要使用内存查看工具了。
内存查看工具有许多,比较有名的有:Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等。它们的基本工作原理大同小异,都是监测 Java程序运行时所有对象的申请、释放等动作,将 内存管理的所有
信息进行统计、分析、可视化。开发人员可以根据这些信息判断程序是否有 内存泄漏问题。一般来说,一个正常的系统在其启动完成后其内存的占用量是基本稳定的,而不应该是无限制的增长的。持续地观察系统运行时使用的内存的大小,可以看到在内存使用监控窗口中是基本规则的锯齿形的图线,如果内存的大小持续地增长,则说明系统存在内存泄漏问题。通过间隔一段时间取一次内存快照,然后对内存快照中对象的使用与引用等信息进行比对与分析,可以找出是哪个类的对象在泄漏。
通过以上四个步骤的分析与处理,基本能处理内存溢出的问题。当然,在这些过程中也需要相当的经验与敏感度,需要在实际的开发与调试过程中不断积累。

转载于:https://www.cnblogs.com/Tpf386/p/7373468.html


http://www.niftyadmin.cn/n/819856.html

相关文章

搜狗,年度优秀开源项目!

哈喽,大家好,我是开源君,一个资深的互联网玩家,致力于为大家分享各领域优质开源项目。今天在逛 GitHub 的时候,发现一个牛逼的项目,搜狗团队重磅开源,项目是关于服务器引擎的,一年时…

Codeforces 165E Compatible Numbers(二进制+逆序枚举)

E. Compatible Numberstime limit per test4 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputTwo integers x and y are compatible, if the result of their bitwise "AND" equals zero, that is, a & b  0. For example…

工信部出手整顿,阿里表示:我先服。。。

该来的终究要来!1无比清爽!不知道从什么时候开始,大家都默认在手机上打开APP时,弹出一个几秒钟的广告。刚开始可能是1秒,后来变成3秒,现在5秒的启动广告也很常见,有很多甚至到了10秒&#xff01…

再见,Dubbo!

都2021年了 还没用过微服务 吗?中台架构还只是听说过?2020年的双十一,天猫订单处理峰值达到58.3万笔/秒,2020年的双十二,数据量高达1200万。2021年的12306网站单日浏览峰值5000 亿次。2021年的一线互联网三高架构 你能…

H5-Web存储API使用

1 <!DOCTYPE html>2 <html>3 <head>4 <title>sessionStorage实现记事本功能</title>5 <meta charset"utf-8" />6 </head>7 8 <body>9 <input type"text" id"note"><br> 1…

Elastic Search快速上手(1):简介及安装配置

前言 最近开始尝试学习Elastic Search&#xff0c;因此决定做一些简单的整理&#xff0c;以供后续参考&#xff0c;快速上手使用ES。 简介 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticse…

偏差-方差分解

最近在看机器学习周志华那本书&#xff0c;受益颇多。我们先抛过来几个问题&#xff0c;再一一解答。 什么是偏差-方差分解&#xff1f;为什么提出这个概念&#xff1f; 什么是偏差&#xff1f;什么是方差&#xff1f; 什么是偏差-方差窘境&#xff1f;应对措施&#xff1f; …

一个劲爆的消息!

世纪大和解来了&#xff01;1淘宝为什么还不支持微信支付&#xff1f;2020年7月&#xff0c;有用户在美团上下单的时候&#xff0c;突然发现美团开始不支持支付宝付款了&#xff0c;打开下方折叠区域也没有出现支付宝。也就是说美团彻底抛弃了支付宝。正当大家议论纷纷的时候&a…