在tomcat7下停止应用时报错:created a ThreadLocal with key of

在tomcat7下停止应用时报错: created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10]

INFO: A valid shutdown command was received via the shutdown port. Stopping the Server instance.Apr 02, 2015 10:36:52 AM org.apache.coyote.AbstractProtocol pauseINFO: Pausing ProtocolHandler ["http-bio-8080"]Apr 02, 2015 10:36:52 AM org.apache.coyote.AbstractProtocol pauseINFO: Pausing ProtocolHandler ["ajp-bio-8009"]Apr 02, 2015 10:36:52 AM org.apache.catalina.core.StandardService stopInternalINFO: Stopping service CatalinaApr 02, 2015 10:36:52 AM org.apache.catalina.core.ApplicationContext logINFO: Closing Spring root WebApplicationContextApr 02, 2015 10:36:52 AM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaksSEVERE: The web application [/techrevmanager5] created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$3] (value [com.opensymphony.xwork2.inject.ContainerImpl$3@49860b6d]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@7f5846d0]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.Apr 02, 2015 10:36:52 AM org.apache.coyote.AbstractProtocol stopINFO: Stopping ProtocolHandler ["http-bio-8080"]Apr 02, 2015 10:36:52 AM org.apache.coyote.AbstractProtocol stopINFO: Stopping ProtocolHandler ["ajp-bio-8009"]Apr 02, 2015 10:36:52 AM org.apache.coyote.AbstractProtocol destroyINFO: Destroying ProtocolHandler ["http-bio-8080"]Apr 02, 2015 10:36:52 AM org.apache.coyote.AbstractProtocol destroyINFO: Destroying ProtocolHandler ["ajp-bio-8009"]

先说一下开发环境清单:

Tomcat-7.0.59xwork-core-2.2.1struts2-core-2.2.1分析过程:从错误情况来看,是xwork中的类com.opensymphony.xwork2.inject.ContainerImpl出现了问题。下载xwork-core-2.2.1的源码,打开ContainerImpl文件,看到行557-583中的代码,,确实存在内存未释放的问题://这里在线程变量中初始化了一维数组ThreadLocal<Object[]> localContext = new ThreadLocal<Object[]>() {@Overrideprotected Object[] initialValue() { return new Object[1];} };/*** Looks up thread local context. Creates (and removes) a new context if* necessary.*/<T> T callInContext(ContextualCallable<T> callable) {Object[] reference = localContext.get();if (reference[0] == null) { reference[0] = new InternalContext(this); try {return callable.call((InternalContext)reference[0]); } finally {// Only remove the context if this call created it.reference[0] = null;//这里只将数组中的元素释放,并未将线程变量的数组对象释放 }} else { // Someone else will clean up this context. return callable.call((InternalContext)reference[0]);}}解决方法:问题和原因都找到,那么解决起来就简单了,有两种方案可以选择:升级xwork的jar文件版本,根据我的检查,从xwork-core-2.3.3及以后的版本中这个问题就不存在了。相应地,你可以需要升级你的struts2-core-2.3.3以上。修改xwork-core-2.2.1中的com.opensymphony.xwork2.inject.ContainerImpl文件,编译后放入classpath路径下(以取代jar文件中的类)

<T> T callInContext(ContextualCallable<T> callable) {Object[] reference = localContext.get();if (reference[0] == null) { reference[0] = new InternalContext(this); try {return callable.call((InternalContext)reference[0]); } finally {// Only remove the context if this call created it.reference[0] = null;//将线程变量的数组对象释放this.localContext.remove(); }} else { // Someone else will clean up this context. return callable.call((InternalContext)reference[0]);}}

可笑的小心谨慎,还有从来就不会安全的安全感。

在tomcat7下停止应用时报错:created a ThreadLocal with key of

相关文章:

你感兴趣的文章:

标签云: