收藏源地址:http://blog.sina.com.cn/u/45a3a50b0100070g
问题陈述:
tomcat服务器运行一段时间后,tomcat控制台报错:
java.lang.outOfMemoryError,java.lang.outOfMemoryError
然后tomcat服务立即死,只有重启tomcat才能恢复服务
初步确定原因
1,java虚拟机jvm内存过小
2,程序不严密,产生太多的垃圾
解决对策:
针对原因1:
增加jvm的内存大小。
JVM即是java虚拟机,它运行时候占用一定的内存,其大小是有限定的,如果程序在运行时jvm占用的内存大于某个限度,则会产生内存益处,也就是“java.lang.outofmemoryerror”。
作为web容器的tomcat(包括resin等)在运行时候,会直接或间接产生一个java.exe进程,可以看成一个jvm进程。由于这些 web容器在不停的运行,也就是jvm不停的工作,jvm会不断的产生垃圾(所胃的垃圾,简单可认为是指程序进行后遗留下的无用的对象),也会不停的回收 垃圾。当回收垃圾的速度比产生垃圾的速度的慢时,垃圾就会不停的增长,当垃圾增长超过一定限度,也就是垃圾对象占用的内存超过jvm内存的最大限度。此时 jvm就会出现运行时错误,也就是error,由于error属于致命错误,不能处理,故tomcat等就会断掉,只有重启tomcat。
针对此,我们可以设想,如果jvm内存的没有限度,并且有无限大的内存,那jvm就永远不会出现内存溢出了。但是,傻子都知道我们在做白日梦。既然 这样行不通,那我们就退一步,所胃退一步海阔天空嘛,我们可以适当增大jvm的最大内存,以缓解jvm来不及回收垃圾而导致的内存不断增长。jdk1.4 默认jvm的最大内存为128M,我们可以把tomcat等web容器的jvm最大内存加大,比如我们可以增大到256M,甚至1G等,只要不超过计算的 内存都行,不过凡事都有个度,设置过大肯定不是最好的。至于要个jvm设置多大的内存则要通过我们不断尝试。
如何增加jvm的内存呢?
第一,在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。
第二,对tomcat容器,可以在启动时对jvm设置内存限度。对tomcat,可以在catalina.bat中添加:
"set CATALINA_OPTS=-Xms128M -Xmx256M
set JAVA_OPTS=-Xms128M -Xmx256M",或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M -Xmx256M,其具体操作可以到网上去找找。
第三,对resin容器,同样可以在启动时对jvm设置内存限度。在bin文件夹下创建一个startup.bat文件,内容如下:
@echo off
call "httpd.exe" "-Xms128M" "-Xmx256M"
:end
其中"-Xms128M"为最小内存,"-Xmx256M"为最大内存。
第四,其他容器,如ibm webswhere,可以通过配置文件加大jvm内存。
第五,修改jdk内核,个人想法,但没去研究过。
针对原因2:
由于jvm产生的垃圾是由我们所写的代码产生的,质量好的代码产生的垃圾少,相反就会产生很多垃圾。由于jvm的最大内存不能无限增大,故增大jvm的最大内存应该是在代码已经达到很优化时才实施的,所以优化程序才是我们最先要做的。
如何优化程序:
第一,避免死循环。仔细检查程序,防止出现死循环,这是比较容易检查的。
第二,可以适当手动回收垃圾
第三,
应该及时释放种资源:内存, 数据库的各种连接。
释放资源的时候不能依赖于java的垃圾自动回收机制,最好也不要用finalize方法,因为无用单元回收不是一个完全可以确定的过程,作为低优先级进程,往往是系统没有内存时才调用垃圾回收进程。
由于我们在Java程序中声明了好多对象,占用了内存空间,程序结束时没有将这些对象或对象的引用进行释放,从而导致Java虚拟机(JVM)进行垃圾回收(GC)时,不能够回收这些对象。这样,Java所用的内存就会一直增加,直至溢出,进而导致Resin死机。
导致Java内存溢出的根本原因是Java程序的不规范或不健壮。因此,从根本上解决Java内存溢出的唯一方法就是修改Java程序,及时地释放没用的对象,释放内存空间。
除了这个方法以外,还有一些应急措施,可以临时缓解一下系统的运行。Resin默认情况是死机以后不能访问网站,必须手动重启Resin,但不可能一直看在机器旁边,看Resin有没有死机。所以这里介绍一种让Resin自重启的方法。
打开Resin的配置文件resin.conf(一般情况下,该文件在Resin目录的conf文件夹下)。里面有一段内容如下所示:
这段内容默认情况下是被注释的。它的功能是让Resin每隔一分钟就测试一下能否访问/ping/ping.jsp文件,测试时间是1s,如果不成功,就 重试三次。如果三次都不成功,Resin就自动重启。所以将这段话下半部分(从"")的注释去掉,然后在Resin的发布目录中新建一个文件夹ping, 在ping文件夹下新建一个ping.jsp文件,文件中可以写入简单的一句话,如:。
好,大功告成,启动Resin,这样就不用担心Java内存溢出导致Resin死机了,因为Resin死机后会马上重新启动。
当然,这只是应急措施,不是长久之计。如果从长计议,还是要耐心的更改Java程序!
分享到:
相关推荐
最近在跑程序,然后Pycharm就跳出out of memory 的错误提示,可能是由于读取的数据太多导致的,Pycharm有一个默认内存的最大容量上线,跳出提示的是1024M,也就是分配给Pycharm的内内存不够啦! 一、说明: pycharm...
在IT行业中,"APE(flex out of memory)"这个问题通常是与Adobe Flex开发相关的内存溢出问题。Flex是一种开源的、基于MXML和ActionScript的框架,用于构建富互联网应用程序(RIA)。当你遇到“Out of memory-cannot ...
标题 "Tomcat Out of Memory" 指的是在运行Apache Tomcat服务器时遇到的一种常见问题,即内存溢出。这通常发生在Tomcat处理大量请求、加载过多应用或资源,或者配置不当导致内存分配不足时。当Java虚拟机(JVM)无法...
"Out of memory" 是一个常见的计算机错误提示,通常在运行程序或系统操作时出现,意味着计算机没有足够的内存(RAM)来执行请求的操作。这可能是由于多个原因造成的,包括但不限于资源管理不当、内存泄漏、大型数据...
然而,在训练深度学习模型时,我们经常遇到“CUDA error: out of memory”这样的错误,这表明GPU的显存不足以运行当前的任务。本文将详细介绍这个问题的原因、影响以及解决方法。 ### 问题原因 1. **模型复杂度过...
解决Out of memory问题,玩游戏的童鞋遇到的问题,希望能帮到那些遇到此类问题的童鞋
标题 "BlazeDS+Spring+activeMQ outofmemory" 指的是在使用BlazeDS、Spring和ActiveMQ集成的环境中遇到了内存溢出问题。BlazeDS是一个开放源码的服务器端技术,它允许双向通信,使Flex或AJAX客户端能够与Java后端...
一次奇怪的Out of Memory 分析(附图)
标题 "使用Memory Analyzer tool检测OutofMemory异常" 涉及到的是Java内存管理的一个重要环节,即如何通过工具分析并解决程序运行时出现的内存溢出问题。Memory Analyzer Tool (MAT) 是由Eclipse基金会开发的一款...
### OutOfMemoryError在Java中的理解与解决策略 在Java编程中,`OutOfMemoryError`是一种常见的运行时异常,它通常发生在JVM试图为新对象分配内存时,但堆内存空间已满或无法进一步扩展的情况下。...
标题与描述中的关键词“Tomcat Out of Memory Solution”指向了在运行Tomcat服务器时遇到内存溢出错误(Out of Memory Error)的解决方法。在IT领域,尤其是Java应用服务器环境中,Tomcat作为一款广泛使用的开源轻量...
"Out of Memory"是计算机操作系统中常见的一个错误提示,意味着系统在执行某个程序或操作时,没有足够的内存资源可供分配。这通常是由于以下几个原因引起的: 1. **运行的程序占用内存过大**:某些大型应用程序,如...
Git是世界上最流行的分布式版本控制系统,但在使用过程中可能会遇到各种问题,其中之一就是"Out of memory"错误。这个错误通常发生在执行诸如`git clone`这样的大型操作时,当Git尝试分配大量内存来处理数据时,如果...
在Python编程过程中,有时会遇到一个令人头疼的问题——"out of memory",即内存不足。这个问题通常发生在程序尝试分配超出系统可用内存的空间时。当Python解释器无法为新对象分配足够的内存时,它会抛出`Memory...
在使用PyTorch进行深度学习模型训练时,有时会遇到一个常见的问题,即GPU显存充足,但在运行过程中却报出“out of memory”错误。这种情况可能会让人困惑,因为直观上,既然显存足够,就不应该出现这样的问题。本文...
"string-concatenate-outofmemory.rar_crash" 这个标题暗示了一个与字符串连接(concatenation)有关的问题,可能在特定条件下导致程序崩溃。描述中提到的测试目标是检查连续的字符串拼接是否会抛出异常,而不是直接...
MySQL数据库在运行过程中遇到“mysqld-nt: Out of memory (Needed 1677720 bytes)”错误,通常表示服务器在处理查询时内存不足。这个问题可能由多种因素引起,包括不当的配置参数、内存限制以及系统架构。以下是一些...