之前在做一个旧软件的升级维护工作,其中莫名其妙的遇见了一个令人内存溢出问题,之前花了好长时间来解决这个问题都无果,所以应该还是挺复杂的。这里稍稍记录下方法。
这个软件使用的框架比较杂,比如后端使用的框架包括:Struts,Spring,Ibaties,Hibernate等等...毕竟是旧软件,维护的人员多,流动的工程师也多,所以整个东西比较杂......这也就导致了后来莫名奇妙的出现了各种奇葩的问题。当然最令人费解的就是这个内存溢出问题。
尝试找了一堆的监控软件运行的软件监测整个软件的运行,当然,也就用了jvisualvm和Jprofiler,可能是因为刚开始使用这些检测软件,最终找到了整个软件运行时内存的一些变动规律,但是并没有发现发生内存溢出的具体地方。通过监测,可以找到一些大范围内,出现内存溢出的地方。通过高频度的操作某一发生内存溢出几率大的地方,开始可以使内存溢出的状态出现。
尝试看了程序一些导致内存溢出的代码,发现除了可能某处会有大量数据操作,也并没有别的特别之处。而且之前重现内存溢出的操作,在操作一些小的数据量的时候,也有一定的几率回导致内存溢出。
所以推测出现内存溢出的原因可能更大的关系是在于使用的框架本身。
再仔细看异常信息时,会发现,其中确实包含了框架的内容。很容易的就能找到Struts的字眼。
于是立马在网络上搜索关键字:Struts内存溢出。
果不其然,能找到一堆的关于Struts内存溢出的问题。不过大多只有问题,没有答案。尝试了一些网络上有人提到的解决方案,但是实际测试下来,还是会有内存溢出的问题出现。
忽然想到,是不是因为Strut本身没有释放内存呢?所以马上在搜索引擎上打出:Struts内存释放...
====================================
好吧,赶项目先。后来的解决是:在web.xml中添加了如下一句:
struts-prepare
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter
struts-prepare
/*
struts-execute
org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter
struts-execute
/*
===================================
异常信息:
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2895)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1173)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1681)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:144)
at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:108)
at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(SpringObjectFactory.java:233)
at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:153)
at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
at com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:121)
at com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:297)
at com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:397)
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:70)
at org.apache.struts2.rest.RestActionProxyFactory.createActionProxy(RestActionProxyFactory.java:53)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:536)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.bzy.filter.LoginFilter.doFilter(LoginFilter.java:137)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.extremecomponents.table.filter.AbstractExportFilter.doFilter(AbstractExportFilter.java:49)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)