tomcat内存溢出

合集下载

Tomcat内存溢出及线程紊乱问题研究

Tomcat内存溢出及线程紊乱问题研究

Tomcat内存溢出及线程紊乱问题研究摘要:在很多基于B/S结构的网站架构中,WEB容器内存溢出及线程紊乱问题比较隐蔽,很多时候在测试阶段并不能发现,只有在现实中大规模数据和高并发量的情况下问题才逐渐的暴露出来。

因此,在网站正式发布前代码进行走查和技术改进,并修改相关服务器软件的配置,可以在很大程度上减少此类事件的发生。

本文以Tomcat为例,对WEB容器在数据传输过程中内存溢出及线程紊乱的表现、原因及解决方案作了简要论述。

关键词:Tomcat;WEB容器;内存溢出;线程紊乱随着Internet技术的普及,各地方学校、研究所和商业单位都在积极进行基础教育资源网和资源库的建设。

然而,随着资源网使用人数的不断增加,其并发量也在急剧增长,对WEB服务器的承压性和稳定性提出了新的挑战。

然而大多数WEB容器均有内存限制,因此,在服务器没有内存还有很大空缺的情况下,WEB容器内存首先溢出,经常报“OutOfMemory”错误,并与其他因素一道引发了线程紊乱,导致应用系统的某些功能重复执行,并且引起了数据库服务器崩溃、系统越来越慢直到死机等问题。

随着互联网技术的发展,基于WEB容器大规模数据传输以及并发量的需求已经日渐突出,而数据传输效率、WEB应用服务器性能以及应用系统的稳定性等因素直接影响了数据传输的质量。

在以Tomcat为WEB容器的环境中,若以上问题处理不当,则很多时候表现为Tomcat内存溢出以及线程紊乱,造成服务器宕机,严重影响正常的网站运行。

1Tomcat内存溢出及线程紊乱的主要表现Tomcat内存溢出主要是通过系统速度、系统性能表现以及系统日志来反映的。

通过对日志文件和系统表现的分析与判断,即可断定是否为内存溢出;线程紊乱是指在Web容器中发生的线程异常的情况,其很多时候是在内存溢出之后出现的,通过对应用系统的操作日志及WEB容器的相关日志即可判断。

1.1Tomcat内存溢出主要表现1)系统的速度越来越慢,甚至出现死机的现象。

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统或者进程所能提供的上限。

导致内存溢出的原因可能是程序中存在内存泄漏、内存分配过多或者递归调用过深等。

下面将介绍三种常见的内存溢出情况及其系统配置解决方案。

1.程序内存泄漏导致内存溢出:内存泄漏指程序在运行过程中动态分配内存空间后,没有对其进行释放,导致一部分内存无法再次使用。

长时间运行的程序中,如果内存泄漏较为严重,系统可用内存会不断减少,直到最终耗尽所有内存资源。

解决方案:使用内存泄漏检测工具来检测和修复程序中的内存泄漏问题。

同时,可以考虑使用自动内存管理的编程语言,如Java和Python,在程序运行过程中自动回收未使用的内存。

2.内存分配过多导致内存溢出:解决方案:优化程序的内存使用,尽可能减小内存分配的数量和大小。

可以通过使用更高效的内存管理算法来减少内存碎片,或者使用内存池技术来提前分配一定量的内存供程序使用。

3.递归调用过深导致内存溢出:递归函数在每次调用时会将一定量的数据压入栈中,如果递归调用层数过深,栈的空间可能会超过系统的限制,从而导致内存溢出。

这种情况通常发生在没有设置递归终止条件或者递归层数过多的情况下。

解决方案:优化递归算法,设置合适的递归终止条件,避免递归调用过深。

如果无法避免使用递归算法,可以考虑使用尾递归或者迭代算法来替代递归调用,减少栈的压力。

在系统配置方面,可以采取以下措施来预防和解决内存溢出问题:1.增加系统内存容量:如果内存溢出是由于系统可用内存不足引起的,可以考虑增加系统的内存容量。

这可以通过增加物理内存条或者使用虚拟内存技术来实现。

虚拟内存技术会将部分磁盘空间用作缓存,并将一部分数据暂时存储在磁盘上,以释放内存空间。

2. 调整JVM参数:对于使用Java虚拟机(JVM)的应用程序,可以通过调整JVM的参数来控制内存的分配和管理。

例如,可以通过设置-Xmx参数来限制JVM使用的最大堆内存大小,或者通过设置-XX:MaxPermSize参数来限制JVM使用的最大持久代(PermGen)内存大小。

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统所分配的内存空间,导致程序崩溃或出现异常。

内存溢出通常是由于程序设计或系统配置问题引起的。

以下是三种常见的内存溢出情况及相应的系统配置解决方案。

1.单个进程占用内存过大:当一些进程在运行过程中占用的内存超过系统分配的限制时,就会导致内存溢出。

这种情况通常发生在大型应用程序或者后台服务运行时。

解决方案:-增加物理内存:在服务器或计算机中增加物理内存,以满足进程运行所需的内存空间。

-调整虚拟内存:将物理内存和虚拟内存结合使用,允许操作系统使用虚拟内存作为物理内存的扩展,从而提供更大的内存容量。

-优化应用程序:通过优化程序代码、降低内存使用、合理管理资源等方法,减少进程对内存的占用。

2.长时间运行的应用程序产生泄露:有些应用程序在长时间运行后会产生内存泄露的问题,即分配并使用内存后没有将其释放,导致内存占用逐渐增加,最终导致内存溢出。

解决方案:-使用垃圾回收机制:在一些支持垃圾回收的编程语言中,通过垃圾回收机制可以自动释放未使用的内存。

开发人员可以使用这些机制来解决内存泄露问题。

-引入内存监控工具:使用内存监控工具来检测应用程序中的内存泄露,定位并解决导致内存泄露的代码问题。

-定期重启应用程序:定期重启应用程序可以清理内存,防止内存泄露导致内存溢出。

3.大规模并发请求导致内存压力增加:在高并发的情况下,当系统同时处理大量的请求时,每个请求所占用的内存可能累积增加,导致整体内存压力增加,最终出现内存溢出。

解决方案:-加大系统负载均衡能力:通过增加负载均衡器、引入缓存机制等方式,将请求分散到多台服务器上,减少单台服务器的内存压力。

-优化数据库访问:对于一些频繁读写数据库的操作,可以通过合理的数据库设计、使用索引、缓存查询结果等方法,减少对数据库的访问,降低内存压力。

-调整服务器配置:合理设置服务器的最大并发连接数、线程池大小等参数,根据实际需求分配内存资源。

Dockertomcat的设置内存大小配置方式

Dockertomcat的设置内存大小配置方式

Dockertomcat的设置内存⼤⼩配置⽅式安装再docker中的tomcat,在下载⼤⽂件或者某些情况下,会出现tomcat的内存溢出等情况,所以需要配置tomcat的内存⼤⼩,docker中的tomcat内存⼤⼩配置有两种⽅式:⼀、挂载docker中的配置⽂件通过将docker中tomcat的catalina.sh配置⽂件挂载到宿主机中,然后再catalina.sh配置jvm内存⼤⼩即可。

1、需要重新运⾏⼀个tomcat容器(注意:端⼝和容器名称不能重复)docker run -d \-v /server/webapps:/usr/local/tomcat/webapps/ \-v /server/catalina.sh:/usr/local/tomcat/bin/catalina.sh \-v /server/logs/demo:/server/logs/demo \-e TZ="Asia/Shanghai" \--privileged=true \--name demo \-p 8080:8080 \tomcat8说明:* -v /server/webapps:/usr/local/tomcat/webapps/ 挂载当前项⽬的运⾏⽬录到tomcat下的webapps* -v /server/catalina.sh:/usr/local/tomcat/bin/catalina.sh 挂载宿主机的catalina.sh到docker中tomcat下的catalina.sh* -v /server/logs/demo:/server/logs/demo 挂载⽇志到宿主机中* -e TZ="Asia/Shanghai" 设置时区* --privileged=true 设置拥有容器中的真正的root权限* -p 8080:8080 映射端⼝* tomcat8 镜像的名称2、catalina.sh中的配置内存cygwin=false下⾯加⼊:JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=256m"-xms 初始化堆内存-xmx 最⼤堆内存⼆、直接修改tomcat容器的catalina.sh的配置可以直接进⼊容器中修改tomcat的catalina.sh的配置⽂件,不过该⽅法不推荐,因为以后再次秀挂⽐较⿇烦,并且不⽅便配置,如果需要重新运⾏容器的时候,不知道容器中的内存⼤⼩的配置1、进⼊容器docker exec -it <container_name> /bin/bash2、找到catalina.sh配置⽂件, 并增加配置(第⼀步中增加的配置语句即可)// 如果没有vi 命令,则需要安装vi /usr/local/tomcat/bin/catalina.sh// 退出容器,并重新启动exitdocker restart <containner_name>注意:如果修改Catalina.sh的时候提⽰该⽂件是⼀个只读⽂件或者提⽰没有权限修改,那么则需要以root权限进⼊容器,具体的⽅法如下补充:Docker容器中的root权限获取有⼀些操作是经常需要进⼊到docker容器中操作的,例如突然需要修改某个配置⽂件等,但是修改该⽂件是需要root权限,可以参考下⾯的解决⽅案通常修改⽂件时会提⽰:read-only file system 或者 Permission denied1、挂载配置⽂件在运⾏docker容器时,可以将该配置⽂件复制⼀份到宿主机,然后run的时候,加载-v参数,将宿主机的配置⽂件挂载到docker中即可。

session不及时释放导致内存溢出的功能问题分析

session不及时释放导致内存溢出的功能问题分析

session不及时释放导致内存溢出的功能问题分析背景:做⼀个⽹站的时候,觉察服务器上⼀段⼯夫尤其不安宁,每隔⼀段⼯夫就会报”OutOfMemoryError: PermGen space”讹谬,于是⽹站也就歇菜了.安排环境:windows2003,tomcat6.0,spring mvc2.5帮助分析⼯具:jprofile6,visualvm,mat分析过程:1.⾃我察看阶段。

由于是报perm区失常,我率先想到,系统默认perm区太⼩,想想该当要调剂perm区⼤⼩,敞开catalina.bat,设置了JAVA_OPTS,JAVA_OPTS="-server -Xms512m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=784m"这么设置后,模仿歇菜时候的情形举⾏压⼒测验,觉察蛮安宁的,未曾揭⽰什么问题,这时⼜精细察看代码,⼤约就未曾揭⽰频繁创⽴不可回收的草芥对象,于是就先这么吧。

过了⼀段⼯夫觉察⼜出问题了,还是perm溢出。

随后我计算下perm区曾经够⼤了,怎么还会报这个失常,此刻极其弥蒙中....2.⼯具帮助分析。

visualvm 利⽤visualvm看看perm区是否真的像传说中说的那样---"perm溢出了",看来还是恳挚点⽤apache⾃带的⼯具做压⼒测验看看是不是这个地⽅引起的测验⼯具⽤apache⾃带的 ./ab -n 100000 -c 40 http://om/class/kw-童卫⾐.html40个并发的时候perm区在30m处跌停,⼤约坚持0增长。

看来和perm区没联系。

perm区看下heap区觉察问题了 40并发下到尔后⼤约坚持5分钟顺次full gc了,这么开⼼啊,本来heap区出问题了,多个利⽤放在⼀个tomcat⾥的时候,万⼀⼀个利⽤刚好这么了,刚开始的heap,导航仪好像也没什么问题,烦闷了~~~继续弥蒙~~~~只能期待,等着出问题吧...半个⼩时过去了,还是这么....陡然觉察惊喜了。

java异常解决方案

java异常解决方案

java异常解决方案一、Hibernate(1)org.hibernate.TransientObjectException: object references an unsaved transient instance....(2)org.springframework.orm.hibernate3.HibernateSystemException: Don't change the reference to a collection withcascade="all-delete-orphan": entity.Klass.students; nested exception is org.hibernate.HibernateException: Don't change the reference to a collection with cascade="all-delete-orphan": entity.Klass.students二、Tomcat(1)tomcat启动时报错:java.io.EOFException(2)tomcat内存溢出三、JAVA基本(1)ng.ClassCastException:(2)ng.UnsupportedClassVersionError: Bad version number in .class file四、JSP(1)javax.servlet.jsp.JspException:(2)org.apache.jasper.JasperException: Unable to compile class for JSP:(3)Servlet.service() for servlet jsp threw exceptionng.Error: Unresolved compilation problem:(4)ng.Error: Unresolved compilation problem:The method contextInitialized(ServletContextEvent) of type CreateDataSourceTableListener must override a superclass method(5)Servlet.service() for servlet jsp threw exception ng.Error: Unresolved compilation problem:The method setCharacterEncoding(String) is undefined for the type ServletResponse五、SSH整合(1)ng.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener(2)Exception starting filter struts2 Class:com.opensymphony.xwork2.spring.SpringObjectFactory File: SpringObjectFactory.java Method: getClassInstance(3)(7)(8)org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'biz' defined in class path... (4)Exception starting filter struts2The action name cannot be the same as the action suffix [Action] - Class: org.apache.struts2.convention.SEOActionNameBuilder (5)avax.management.RuntimeErrorException: Error thrown in preDeregister methodCaused by: ng.NoClassDefFoundError:org/apache/struts2/util/ObjectFactoryDestroyable(6)Unable to load configuration. - bean -jar:file:/D:/Tomcat/tomcat/apache-tomcat-6.0.30/webapps/tes t/WEB-INF/lib/struts2-core-2.2.3.1.jar!/struts-default.xml: 29:72六、Struts(1)ng.NoSuchMethodException:action.StudentAction.getAllStudent()(2)Caused by: ng.ClassCastException:org.apache.xerces.parsers.XML11Configuration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration (3)No result defined for action and result七、Android(1)There is no android project named 'cm-android'一、Hibernate一(1)org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: er某个对象的某个属性是一个实体,在这个实体没有保存之前就保存这个对象而造成了这个错误。

Tomcat并发优化、内存配置、垃圾回收、宕机预防

Tomcat并发优化、内存配置、垃圾回收、宕机预防Tomcat并发优化、内存配置、垃圾回收、宕机预防⽬录Tomcat并发优化、内存配置、垃圾回收、宕机预防⽬录序⾔⼀、Tomcat并发优化(1) tomcat并发参数(2) tomcat并发配置⼆、Tomcat内存配置(1) tomcat内存参数(2) tomcat内存配置三、Tomcat垃圾回收(1) JVM中对象的划分及管理(2) jvm垃圾搜集参数(3) tomcat垃圾搜集配置四、Tomcat宕机预防(1) TCP端⼝状态(2) Windows系统下的TCP参数(3) tomcat假死分析及预防五、结语序⾔这⼏天系统问题层出不穷,服务器并发性差、tomcat内存溢出、假死宕机、⽹络阻塞,搞得我好不难受,寝⾷难安。

但是经过⾼⼈指点、⽹络资料,再加上实践运⾏测试,系统逐渐稳定下来,性能也提升了不少,轻松之余,为⼤家分享我的经历,希望⼤家能够有所收获。

⼀、Tomcat并发优化tomcat并发量与其配置息息相关,⼀般的机器⼏百的并发量⾜矣,如果设置太⾼可能引发各种问题,内存、⽹络等问题也能在⾼并发下暴露出来,因此,配置参数的设置⾮常重要。

(1) tomcat并发参数maxThreads:最⼤的并发请求数,当cpu利⽤率⾼的时候,不宜增加线程的个数,当cpu利⽤率不⾼,⼤部分是io阻塞类的操作时,可以适当增加该值。

maxSpareThreads:Tomcat连接器的最⼤空闲 socket 线程数acceptCount:当处理任务的线程数达到最⼤时,接受排队的请求个数connectionTimeout:⽹络连接超时,单位毫秒enableLookups:若为false则不进⾏DNS查询,提⾼业务能⼒应设置为falsedisableUploadTimeout:若为true则禁⽤上传超时 以上是⼀些⽐较常⽤的参数,Tomcat中server.xml配置详解会有更加详细的介绍。

Tomcat6 一些调优设置内存和连接数

Tomcat6 一些调优设置内存和连接数公司的一个服务器使用Tomcat6默认配置,在后台一阵全点击服务器就报废了,查了一下就要是PERMSIZE默认值过小造成(16-64)TOMCAT_HOME/bin/catalina.sh添加一行:JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"问题解决(可能为调用JAR包过多原因)下面是网上看到一些设置JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M-XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "当在对其进行并发测试时,基本上30个USER上去就当机了,还要修改默认连接数设置:以下红色四行TOMCAT6中好相没有,手工加上就可以了,基本上可以解决连接数过大引起的死机。

具体数值可跟据实际情况设置<Connector port="80" protocol="HTTP/1.1"maxThreads="600"minSpareThreads="100"maxSpareThreads="500"acceptCount="700"connectionTimeout="20000"redirectPort="8443" />这样设置以后,基本上没有再当机过。

maxThreads="600" ///最大线程数minSpareThreads="100"///初始化时创建的线程数maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

内存溢出的解决思路

内存溢出的解决思路内存溢出是指应⽤系统中存在⽆法回收的内存或使⽤的内存过多,最终使得程序运⾏要⽤到的内存⼤于虚拟机能提供的最⼤内存。

引起内存溢出的原因有很多种,常见的有以下⼏种: 1.内存中加载的数据量过于庞⼤,如⼀次从数据库取出过多数据; 2.集合类中有对对象的引⽤,使⽤完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产⽣过多重复的对象实体; 4.使⽤的第三⽅软件中的BUG; 5.启动参数内存值设定的过⼩;内存溢出的解决⽅案:第⼀步,修改JVM启动参数,直接增加内存。

(-Xms,-Xmx参数⼀定不要忘记加。

) 第⼆步,检查错误⽇志,查看“OutOfMemory”错误前是否有其它异常或错误。

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

重点排查以下⼏点: 1.检查对数据库查询中,是否有⼀次获得全部数据的查询。

⼀般来说,如果⼀次取⼗万条记录到内存,就可能引起内存溢出。

这个问题⽐较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,⼀次查询就有可能引起内存溢出。

因此对于数据库查询尽量采⽤分页的⽅式查询。

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

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

4.检查对数据库查询中,是否有⼀次获得全部数据的查询。

⼀般来说,如果⼀次取⼗万条记录到内存,就可能引起内存溢出。

这个问题⽐较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,⼀次查询就有可能引起内存溢出。

因此对于数据库查询尽量采⽤分页的⽅式查询。

5.检查List、MAP等集合对象是否有使⽤完后,未清除的问题。

List、MAP等集合对象会始终存有对对象的引⽤,使得这些对象不能被GC回收。

第四步,使⽤内存查看⼯具动态查看内存使⽤情况从内存溢出看Java 环境中的内存结构 作为有个java程序员,我想⼤家对下⾯出现的这⼏个场景并不陌⽣,倍感亲切,深恶痛绝,抓⼼挠肝,⼀定会回过头来问为什么为什么为什么会这样,嘿嘿,让我们看⼀下我们⽇常在开发过程中接触内存溢出的异常: Exception in thread "main" [Full ng.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Unknown Source)at java.util.Arrays.copyOf(Unknown Source)at java.util.ArrayList.grow(Unknown Source)at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)at java.util.ArrayList.ensureCapacityInternal(Unknown Source)at java.util.ArrayList.add(Unknown Source)at oom.HeapOOM.main(HeapOOM.java:21) Exception in thread "main" ng.StackOverflowErrorat java.nio.CharBuffer.arrayOffset(Unknown Source)at sun.nio.cs.UTF_8.updatePositions(Unknown Source)at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(Unknown Source)at sun.nio.cs.UTF_8$Encoder.encodeLoop(Unknown Source)at java.nio.charset.CharsetEncoder.encode(Unknown Source)at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)at sun.nio.cs.StreamEncoder.write(Unknown Source)at java.io.OutputStreamWriter.write(Unknown Source)at java.io.BufferedWriter.flushBuffer(Unknown Source)at java.io.PrintStream.write(Unknown Source)at java.io.PrintStream.print(Unknown Source)at java.io.PrintStream.println(Unknown Source)ng.OutOfMemoryError: PermGen spaceException in thread "main" ng.OutOfMemoryErrorat sun.misc.Unsafe.allocateMemory(Native Method)at oom.DirectMemoryOOM.main(DirectMemoryOOM.java:23) 是不是有⼤家很熟悉的,遇见这样的问题解决起来可能不简单,但是如果现在让⼤家写个程序,故意让程序出现下⾯的异常,估计能很快写出来的也不是很多,这就要求开发⼈员对于java内存区域以及jvm规范有⽐较深的了解。

启动tomcat时报错:http-nio-8080-exec-10

启动tomcat时报错:http-nio-8080-exec-10问题原因:Java的内存溢出故障现象为:cat /apps/links/tomcat/logs/catalina.out2018-11-05 16:08:55[ERROR]-[Thread: http-nio-8080-exec-10]-[io.jpress.admin.controller._AttachmentController.processImage()]: processThumbnail errorng.IllegalArgumentException: sourceRegion.x < 0!at javax.imageio.IIOParam.setSourceRegion(IIOParam.java:188)at io.jpress.utils.ImageUtils.readBuffereImage(ImageUtils.java:112)at io.jpress.utils.ImageUtils.scale(ImageUtils.java:83)at io.jpress.utils.ImageUtils.scale(ImageUtils.java:61)at io.jpress.admin.controller._AttachmentController.processThumbnail(_AttachmentController.java:166)at io.jpress.admin.controller._AttachmentController.processImage(_AttachmentController.java:149)at io.jpress.admin.controller._AttachmentController.doUpload(_AttachmentController.java:127)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at ng.reflect.Method.invoke(Method.java:498)at com.jfinal.aop.Invocation.invoke(Invocation.java:73)at io.jpress.core.interceptor.ActionCacheClearInterceptor.intercept(ActionCacheClearInterceptor.java:27)at com.jfinal.aop.Invocation.invoke(Invocation.java:67)at io.jpress.core.interceptor.HookInterceptor.intercept(HookInterceptor.java:31)at com.jfinal.aop.Invocation.invoke(Invocation.java:67)at io.jpress.interceptor.AdminInterceptor.intercept(AdminInterceptor.java:52)at com.jfinal.aop.Invocation.invoke(Invocation.java:67)at io.jpress.interceptor.GlobelInterceptor.intercept(GlobelInterceptor.java:33)at com.jfinal.aop.Invocation.invoke(Invocation.java:67)at io.jpress.core.interceptor.JI18nInterceptor.intercept(JI18nInterceptor.java:48)at com.jfinal.aop.Invocation.invoke(Invocation.java:67)at com.jfinal.core.ActionHandler.handle(ActionHandler.java:82)at io.jpress.core.MyDruidStatViewHandler.handle(MyDruidStatViewHandler.java:43)at io.jpress.core.cache.ActionCacheHandler.handle(ActionCacheHandler.java:40)at io.jpress.core.JHandler.handle(JHandler.java:81)at io.jpress.core.cache.ActionCacheHandler.handle(ActionCacheHandler.java:40)at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)▽ at .NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)at .SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at ng.Thread.run(Thread.java:748)解决⽅案⼀:设置MyEclipse中Tomcat使⽤的Jdk的VM arguments:-Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=512m如图:解决⽅法⼆:⼿动设置MaxPermSize⼤⼩修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上⾯加⼊以下⾏:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512mcatalina.sh下为:JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一.T omcat内存溢出的三种情况及解决办法分析Tomcat内存溢出的原因在生产环境中tomcat内存设置不好很容易出现内存溢出。

造成内存原因是不一样的,当然处理方式也不一样。

这里根据平时遇到的情况和相关资料进行一个总结。

常见的一般会有下面三种情况:1.OutOfMemoryError:Java heap space2.OutOfMemoryError:PermGen space3.OutOfMemoryError:unable to create new native thread.Tomcat内存溢出解决方案对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。

(-Xms -Xmx -XX:PermSize -XX:MaxPermSize)最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。

第一种:是堆溢出。

原因分析:JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。

可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。

Heap size 的大小是Young Generation 和Tenured Generaion 之和。

在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。

Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx 值。

没有内存泄露的情况下,调整-Xms -Xmx参数可以解决。

-Xms:初始堆大小-Xmx:最大堆大小但堆的大小受下面三方面影响:1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在1.5G~2G;我在2003 server 系统下(物理内存:4G和6G,jdk:1.6)测试1612M,64为操作系统对内存无限制。

)2.系统的可用虚拟内存限制;3.系统的可用物理内存限制。

堆的大小可以使用java -Xmx***M version 命令来测试。

支持的话会出现jdk的版本号,不支持会报错。

-Xms -Xmx一般配置成一样比较好比如set JA V A_OPTS= -Xms1024m -Xmx1024m其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。

可以利用JVM提供的-Xmn -Xms -Xmx 等选项可进行设置实例,以下给出1G内存环境下java jvm 的参数设置参考:JA V A_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "JA V A_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"CA TALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m-XX:NewSize=192m -XX:MaxNewSize=384m"服务器为1G内存:JA V A_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "服务器为64位、2G内存: JA V A_OPTS='-server -Xms1024m -Xmx1536m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m'-------------------解决方案1:-----------------------------前提:是执行startup.bat启动tomcat的方式Linux服务器:在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh添加:JA V A_OPTS='-Xms512m -Xmx1024m'或者JA V A_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"或者CA TALINA_OPTS="-server -Xms256m -Xmx300m"Windows服务器:在catalina.bat最前面加入set JA V A_OPTS=-Xms128m -Xmx350m或者set CA TALINA_OPTS=-Xmx300M -Xms256M(区别是一个直接设置jvm内存,另一个设置tomcat内存,CA TALINA_OPTS似乎可以与JA V A_OPTS不加区别的使用)基本参数说明-client,-server这两个参数用于设置虚拟机使用何种运行模式,一定要作为第一个参数,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。

相反,server模式启动比client慢,但可获得更高的运行性能。

在windows上,缺省的虚拟机类型为client模式,如果要使用server模式,就需要在启动虚拟机时加-server参数,以获得更高性能,对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。

在Linux,Solaris上缺省采用server模式。

此外,在多cup下,建议用server模式-Xms<size>设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为1024的整数倍并且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。

初始堆大小为2MB。

加“m”说明是MB,否则就是KB了。

例如:-Xms6400K,-Xms256M-Xmx<size>设置虚拟机的最大可用大小,缺省单位为字节。

该值必须为1024整数倍,并且要大于2MB。

可用k(K)或m(M)为单位来设置较大的内存数。

缺省堆最大值为64MB。

例如:-Xmx81920K,-Xmx80M当应用程序申请了大内存运行时虚拟机抛出ng.OutOfMemoryError: Java heap space错误,就需要使用-Xmx 设置较大的可用内存堆。

PermSize/MaxPermSize:定义Perm段的尺寸,即永久保存区域的大小,PermSize为JVM启动时初始化Perm 的内存大小;MaxPermSize为最大可占用的Perm内存大小。

在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。

如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.-------------------解决方案2:------------------------前提:是执行startup.bat启动tomcat的方式手动设置Heap sizeWindows服务器:修改TOMCA T_HOME/bin/catalina.bat,在“echo "Using CA TALINA_BASE: $CA TALINA_BASE"”上面加入以下行:Java代码set JA V A_OPTS=%JA V A_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m注:JA V A_OPTS是保留先前设置。

Linux服务器:修改TOMCA T_HOME/bin/catalina.sh在“echo "Using CA TALINA_BASE: $CA TALINA_BASE"”上面加入以下行:JA V A_OPTS="$JA V A_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"注:$JA V A_OPTS是保留先前设置。

-------------------解决方案3:-----------------------------前提:是执行windows的系统服务启动tomcat的方式但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了, 就是说set JA V A_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.解决办法:修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions原值为-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"-Xrs加入-Xms300m -Xmx350m重起tomcat服务,设置生效-------------------解决方案4:-----------------------------前提:是执行windows的系统服务启动tomcat的方式在安裝tomcat時若有勾選"NT Service(NT/2000/XP only)"則安裝完成後在安裝目錄的"bin"目錄裡會有一個tomcat.exe的檔案先把tomcat的服務停掉在命令列模式下(运行里输入CMD)將目錄切換到tomcat的bin目錄用下面的命令把服務移除tomcat -uninstall "Apache Tomcat 4.1"接下來,写个批处理。

相关文档
最新文档