SSH框架,压力测试一个接口,响应时间不断提高,最后TPS为0,后台直接挂了

跪求大神救命~

最开始tomcat有报这样的错:

2015: Servlet.service() for servlet default threw exceptionalve invoke
java.lang.OutOfMemoryError
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:127)
at java.util.jar.JarFile.(JarFile.java:135)
at java.util.jar.JarFile.(JarFile.java:99)
at org.apache.catalina.loader.WebappClassLoader.openJARs(WebappClassLoader.java:2718)
at org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:2958)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2753)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:857)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:574)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:889)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:732)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2262)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

我是修改了自定义的filter,并且重写了Action,发现这个错没了,但是情况还是一样,响应时间越来越长,TPS越来越少

挂掉之后访问接口:

HTTP Status 500 -type Exception report
message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:2963)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2753)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:857)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:571)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.32 logs.

tomcat报错:

严重: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: GC overhead limit exceeded
at ognl.OgnlContext.(OgnlContext.java:107)
at ognl.Ognl.createDefaultContext(Ognl.java:211)
at com.opensymphony.xwork2.ognl.OgnlValueStack.setRoot(OgnlValueStack.java:88)
at com.opensymphony.xwork2.ognl.OgnlValueStack.(OgnlValueStack.java:71)
at com.opensymphony.xwork2.ognl.OgnlValueStackFactory.createValueStack(OgnlValueStackFactory.java:62)
at org.apache.struts2.dispatcher.ng.PrepareOperations.createActionContext(PrepareOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:889)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:732)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

既然测出问题了,就对了啊。

1:GC的效率降低,会出现GC过载的情况,就会出现oom;
查看你的action上下文:
是否有·大对象·没有被合适的释放;
是否有频繁的小对象被实例化,而你没有用o = null来协助GC;
是不是将一个对象的引用包含在了缓存中,而缓存的生命周期很长;
是不是过多的采用了动态代理和反射,导致jvm的perm区过载。

    对象、类的反射、缓存、数据库连接没有关闭、文件流没有关闭、频繁的读取图像到内存等都会引起oom,看你是哪个情况。

2:另外,关注下tomcat的jvm优化选项:
比如 参数你自己根据机器的情况调
set JAVA_OPTS=-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=trueset JAVA_OPTS=-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384mset CATALINA_OPTS=-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m

负载太高,不能响应了。

看你服务器内存的监控,以及jvm中堆的使用。内存超了。

ps -ef|grep tomcat 获得当前tomcat的进程id-pid
jstack -l tomcat >>filename.log获取当前tomcat中有哪些资源未释放

最后发现是使用线程调用hibernate查询的时候,session未释放导致的,一般而言hibernate会自动释放session,不知道为啥在线程中就会出现问题

ps -ef|grep tomcat 获得当前tomcat的进程id-pid
jstack -l tomcat >>filename.log获取当前tomcat中有哪些资源未释放

最后发现是使用线程调用hibernate查询的时候,session未释放导致的,一般而言hibernate会自动释放session,不知道为啥在线程中就会出现问题