内存溢出的原因及解决方法

第1篇:内存溢出的原因及解决方法

引起内存溢出的原因

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2.*类中有对对象的引用,使用完后未清空,使得jvm不能回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

4.使用的第三方软件中的bug;

5.启动参数内存值设定的过小

内存溢出的解决方案:

第一步,修改jvm启动参数,直接增加内存。(-xms,-xmx参数一定不要忘记加。)

第二步,检查错误日志,查看“outofmemory”错误前是否有其它异常或错误。

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

重点排查以下几点:

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

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

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

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

5.检查list、map等*对象是否有使用完后,未清除的问题。list、map等*对象会始终存有对对象的引用,使得这些对象不能被gc回收。

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

第2篇:Tomcat内存溢出分析及解决方法

jvm管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在jvm启动时创建;非堆是留给jvm自己用的,用来存放类的信息的。它和堆不同,运行期内gc不会释放空间。

一、内存溢出类型

1、java.lang.outofmemoryerror:permgenspace

jvm管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在jvm启动时创建;非堆是留给jvm自己用的,用来存放类的信息的。它和堆不同,运行期内gc不会释放空间。如果webapp用了大量的第三方jar或者应用有太多的class文件而恰好maxpermsize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

permgenspace的全称是permanentgenerationspace,是指内存的永久保存区域,这块内存主要是被jvm存放class和meta信息的,class在被loader时就会被放到permgenspace中,它和存放类实例(instance)的heap区域不同,gc(garbagecollection)不会在主程序运行期对permgenspace进行清理,所以如果你的应用中有很class的话,就很可能出现permgenspace错误,这种错误常见在web服务器对jsp进行prepile的时候。如果你的webapp下都用了大量的第三方jar,其大小超过了jvm默认的大小(4m)那么就会产生此错误信息了。

一个最佳的配置例子:(经过本人验*,自从用此配置之后,再未出现过tomcat死掉的情况)

setjava_opts=-xms800m-xmx800m-xx:permsize=128m-xx:maxnewsize=256m-xx:maxpermsize=256m

在linux下在tomcathome/conf/catalina.sh中加上如标红所示的一句代码:可以增加tomcatjvm的内存,这样就不容易出现内存溢出的现象了!

#-----executetherequestedmand-----------------------------------------

java_opts="-server-xms512m-xmx2048m-xx:permsize=128m-xx:maxnewsize=256m-xx:maxpermsize=256m"

#bugzilla37848:onlyoutputthisifwehaveatty

2、java.lang.outofmemoryerror:javaheapspace

第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-xms)是物理内存的1/64,最大空间(-xmx)是物理内存的1/4。如果内存剩余不到40%,jvm就会增大堆到xmx设置的值,内存剩余超过70%,jvm就会减小堆到xms设置的值。所以服务器的xmx和xms设置一般应该设置相同避免每次gc后都要调整虚拟机堆的大小。假设物理内存无限大,那么jvm内存的最大值跟*作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。

注意:如果xms超过了xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者*作系统的最大限制都会引起服务器启动不起来。

垃圾回收gc的角*

jvm调用gc的频度还是很高的,主要两种情况下进行垃圾回收:

当应用程序线程空闲;另一个是java内存堆不足时,会不断调用gc,若连续回收都解决不了内存堆不足的问题时,就会报outofmemory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。

根据gc的机制,程序的运行会引起系统运行环境的变化,增加gc的触发机会。

为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和gc的开销。显示调用system.gc()只能建议jvm需要在内存中对垃圾对象进行回收,但不是必须马上回收,

一个是并不能解决内存资源耗空的局面,另外也会增加gc的消耗。

二、jvm内存区域组成

简单的说java中的堆和栈

java把内存分两种:一种是栈内存,另一种是堆内存

1、在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;

2、堆内存用来存放由new创建的对象和数组

在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理

堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;

栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活*。

java堆分为三个区:new、old和permanent

gc有两个线程:

新创建的对象被分配到new区,当该区被填满时会被gc辅助线程移到old区,当old区也填满了会触发gc主线程遍历堆内存里的所有对象。old区的大小等于xmx减去-xmn

java栈存放

栈调整:参数有+usedefaultstacksize-xss256k,表示每个线程可申请256k的栈空间

每个线程都有他自己的stack

三、jvm如何设置虚拟内存

提示:在jvm中如果98%的时间是用于gc且可用的heapsize不足2%的时候将抛出此异常信息。

提示:heapsize最大不要超过可用物理内存的80%,一般的要将-xms和-xmx选项设置为相同,而-xmn为1/4的-xmx值。

提示:jvm初始分配的内存由-xms指定,默认是物理内存的1/64;jvm最大分配的内存由-xmx指定,默认是物理内存的1/4。

默认空余堆内存小于40%时,jvm就会增大堆直到-xmx的最大限制;空余堆内存大于70%时,jvm会减少堆直到-xms的最小限制。因此服务器一般设置-xms、-xmx相等以避免在每次gc后调整堆的大小。

提示:假设物理内存无限大的话,jvm内存的最大值跟*作系统有很大的关系。

简单的说就32位处理器虽然可控内存空间有4gb,但是具体的*作系统会给一个限制,

这个限制一般是2gb-3gb(一般来说windows系统下为1.5g-2g,linux系统下为2g-3g),而64bit以上的处理器就不会有限制了

注意:如果xms超过了xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者*作系统的最大限制都会引起服务器启动不起来。

提示:设置newsize、maxnewsize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主"gc,大大降低了*能

jvm使用-xx:permsize设置非堆内存初始值,默认是物理内存的1/64;

由xx:maxpermsize设置最大非堆内存的大小,默认是物理内存的1/4。

解决方法:手动设置heapsize

修改tomcat_home/bin/catalina.bat

在“echo"usingcatalina_base:$catalina_base"”上面加入以下行:

java_opts="-server-xms800m-xmx800m-xx:maxnewsize=256m"

第3篇:电脑内存不足的原因及解决方法

脑常提示提示内存不足,怎么办,有人说可以更换更大容量的内存条,或者直接加内存条,但是这样是要花费银子的,除了花钱外,到底还有没有不用花钱的解决办法呢?*是肯定的。下面就让小编为大家介绍一下具体的解决方法吧,欢迎大家参考和学习。

电脑内存不足的原因及解决方法:

一、剪贴板占用了太多的内存

实际上,剪贴板是内存中的一块临时区域,当你在程序中使用了“复制”或“剪切”命令后,Windows将把复制或剪切的内容及其格式等信息暂时存储在剪贴板上,以供“粘贴”使用。如果当前剪贴板中存放的是一幅图画,则剪贴板就占用了不少的内存。这时,请按下述步骤清除剪贴板中的内容,释放其占用的内存资源:

1.单击“开始”,指向“程序”或“所有程序”,指向“附件”,指向“系统工具”,然后单击“剪贴板查看程序”,打开“剪贴板查看程序”窗口。

2.在“编辑”菜单上,单击“删除”命令。

3.关闭“剪贴板查看程序”窗口。

为了与MicrosoftOffice程序提供的多重剪贴板相区分,上述所说的剪贴板,常被我们称为系统剪贴板。如果你正在使用MicrosOftOffice程序,而且使用了其多重剪贴板功能,那么你应清空“Office剪贴板”上的项目,方法是:在“Office剪贴板”任务窗格(OfficeXP)或工具栏(Office2000)上,单击“全部清空”或“清空‘剪贴板’”。当清空“Office剪贴板”时,系统剪贴板也将同时被清空。

二、打开的程序太多

如果同时打开的文档过多或者运行的程序过多,就没有足够的内存运行其他程序。这时,对于多文档界面(MDl)程序,如Word、Excel等,请关闭当前文档外的所有文档,并退出当前未使用的程序,然后或许你就能够继续执行因“内存不足”而被中断的任务。

三、重新启动计算机

如果只退出程序,并不重新启动计算机,程序可能无法将内存资源归还给系统。请重新启动计算机以释放系统资源,然后再次运行程序或执行被中断的任务。

四、自动运行的程序太多

五、让Windows管理虚拟内存设置

如果没有设置让Windows管理虚拟内存或者禁用虚拟内存,那么计算机可能无法正常工作,也可能收到“内存不足”的消息,或在运行某程序时出现相同的错误消息。

1.单击“开始”,单击“设置”,单击“控制面板”,然后双击“系统”。

2.在“系统属*”对话框中,单击“*能”选项卡,然后单击“虚拟内存”按钮。

3.选中“让Windows管理虚拟内存设置—(推荐)”选项,将计算机中可作为虚拟内存使用的硬盘空间量设置为默认值。此时,虚拟内存分页“win386.swp”能够根据实际内存的使用情况动态缩小和放大,最小容量为0,最大容量为硬盘的全部可用空间。

4.单击“确定”按钮。

六、增加可用磁盘空间

由于Windows以虚拟内存分页文件的格式使用硬盘空间以模拟RAM(),所以,尽管已设置为让Windows管理虚拟内存,但是当虚拟内存分页文件所在的驱动器(默认为Windows系统所在的硬盘分区)没有足够的空间时,仍会出现“内存不足”的错误。此时,请执行以下一项或多项*作,增加Windows虚拟内存分页文件所在驱动器上的可用空间:

1.清空回收站,方法是:在桌面上,右键单击“回收站”,再单击“清空回收站”。

2.从磁盘中删除临时文件,方法是:打开“Windows资源管理器”或“我的电脑”窗口,右键单击要释放其空间的磁盘,然后单击“属*”,在“常规”选项卡上,单击“磁盘清理”按钮,选中要删除的不需要的文件前的复选框(如图3),可以阅读列表下面区域中每个文件类型的说明,单击“确定”按钮。

3.从磁盘中删除过期的文件或已存档的文件。理想KS600C速印机的常见故障

4.删除从未使用过的所有文件。

七、程序文件被毁坏

如果仅仅是使用某个程序时,系统提示内存不足,而其他程序可以正常运行,那么可能的原因是该程序文件被毁坏,从而导致内存问题。然而Windows并没有确切地提示表明该程序已损坏,所以请尝试删除并重新安装该程序,然后重新运行该程序。如果系统不再提示内存不足,那么说明原程序文件确实被损坏。

八、使用内存优化软件

内存优化软件有很多,比如RAMIdle和MemoKit就是比较出*的两个。这些软件都可以设置自动清空剪贴板、释放被关闭程序未释放的内存、对Win386.swp文件进行重新组织等,从而免除你手工*作的麻烦,达到自动释放内存的目的,不妨一试!复印机为什么复印的不清晰

九、查杀病毒

系统感染电脑病毒也是导致内存不足的罪魁祸首,当系统出现“内存不足”的错误时,请使用最新的防毒软件查杀病毒,或者在清除电脑病毒之后,就解决了“内存不足”的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 yyfangchan@163.com (举报时请带上具体的网址) 举报,一经查实,本站将立刻删除