我们在tomcat上部署了一个GWT应用程序,经过几个小时的使用(2个QAs执行一般测试),java进程开始使用所有的CPU,并且应用程序变得缓慢。
我查看了tomcat管理器,发现有许多长期运行的HTTP请求,它们都指向"/gwtRequest“,这是我们的RequestFactory servlet。
之后,我使用了一个线程转储,发现转储中所有可运行的http线程都指向"AutoBeanCodexImpl.doCoderFor()“。
"http-8080-51“守护进程com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl.doCoderFor(AutoBeanCodexImpl.java:519) prio=10 tid=0x00007f23d8b81800 nid=0x4981 RUNNABLE 0x00007f23d4285000 java.lang.Thread.State: runnable at java.util.HashMap.get(HashMap.java:303) at prio=10 at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.setProperty(ProxyAutoBean.java:253) at com.google.web.bindery.autobean.vm.impl.BeanPropertyContext.set(BeanPropertyContext.java:44) at com.google.web.bindery.requestfactory.server.Resolver$PropertyResolver.visitValueProperty(Resolver.java:155) at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:289) at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166) at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101) at com.google.web.bindery.requestfactory.server.Resolver.resolveClientValue(Resolver.java:414) at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processInvocationMessages(SimpleRequestProcessor.java:493) at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:235) at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:137) at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)
有人能给我指点我该看的地方吗?谢谢
发布于 2012-09-13 10:29:51
啊哎哟!看起来我们使用的是没有任何同步的静态HashMap
!我相信这是因为AutoBeans最初被设计为只在浏览器中工作,而浏览器是单线程的。
这是固定在干线上,它应该在几天内发布把它变成2.5.0-rc2。您可以跟踪问题所在状态。
https://stackoverflow.com/questions/12403658
复制相似问题