当前位置: 首页 > 面试题库 >

在JSF saveState()期间,线程在HashMap中停留在100%CPU使用率

施季
2023-03-14
问题内容

我们的生产环境中存在问题,HTOP命令中的4个线程的CPU使用率为100%。为了进一步研究该问题,我生成了一个线程转储,以查找正在占用CPU的线程。

这是我发现的。这4个线程具有相同的堆栈跟踪,所有堆栈跟踪均处于 RUNNABLE
状态。不幸的是,由于堆栈跟踪没有引用我的内部代码,所以我一直停留在调查中,而更多地是在Richfaces方面。我认为这是JSF呈现页面的部分。

堆栈跟踪。

"ajp-0.0.0.0-8009-47" daemon prio=10 tid=0x00007fb8040af000 nid=0x172c runnable [0x00007fb8b3bf8000]
   java.lang.Thread.State: RUNNABLE
    at java.util.HashMap.hash(HashMap.java:351)
    at java.util.HashMap.putForCreate(HashMap.java:512)
    at java.util.HashMap.putAllForCreate(HashMap.java:534)
    at java.util.HashMap.<init>(HashMap.java:320)
    at org.ajax4jsf.component.UIDataAdaptorBase.createChildStateCopy(UIDataAdaptorBase.java:894)
    at org.ajax4jsf.component.UIDataAdaptorBase.saveState(UIDataAdaptorBase.java:1554)
    at org.richfaces.component.UIDataTable.saveState(UIDataTable.java:181)
    at org.richfaces.component.html.HtmlDataTable.saveState(HtmlDataTable.java:1361)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1103)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1119)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1119)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1119)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1119)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1119)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1119)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1119)
    at org.ajax4jsf.component.AjaxViewRoot.processSaveState(AjaxViewRoot.java:751)
    at org.ajax4jsf.application.AjaxStateManager.getComponentStateToSave(AjaxStateManager.java:179)
    at org.ajax4jsf.application.AjaxStateManager.buildViewState(AjaxStateManager.java:515)
    at org.ajax4jsf.application.AjaxStateManager$SeamStateManagerWrapper.saveView(AjaxStateManager.java:106)
    at org.jboss.seam.jsf.SeamStateManager.saveView(SeamStateManager.java:89)
    at org.ajax4jsf.application.AjaxStateManager.saveSerializedView(AjaxStateManager.java:470)
    at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:615)
    at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
    at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.josso.servlet.agent.GenericServletSSOAgentFilter.doFilter(GenericServletSSOAgentFilter.java:558)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)
    at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
    at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    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:235)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:436)
    at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:722)

另一件事是,我有什么方法可以利用堆栈跟踪,可以说我想生成一个日志,以便我可以知道正在生成该堆栈跟踪的应用程序中的哪个页面?或者,也许我可以使用相位监听器?

任何帮助,将不胜感激。谢谢。

我正在使用Seam 2.2,Richfaces 3.3.3 final,JSF 1.2。


问题答案:

这个,

java.lang.Thread.State: RUNNABLE
    at java.util.HashMap.hash(HashMap.java:351)
    at java.util.HashMap.putForCreate(HashMap.java:512)
    at java.util.HashMap.putAllForCreate(HashMap.java:534)
    at java.util.HashMap.<init>(HashMap.java:320)

还有这个,

java.lang.Thread.State: RUNNABLE
    at java.util.HashMap.getEntry(HashMap.java:446)
    at java.util.HashMap.get(HashMap.java:405)

是已知的线程安全问题,java.util.HashMap其中一个线程get()同时调用另一个线程同时调用a
put()。线程将在计算哈希值时陷入无限循环。解决此问题的技术方法是改用ConcurrentMap实现。另请参见此dzone文章。

但是,根据您的具体情况,

    at java.util.HashMap.<init>(HashMap.java:320)
    at org.ajax4jsf.component.UIDataAdaptorBase.createChildStateCopy(UIDataAdaptorBase.java:894)
    at org.ajax4jsf.component.UIDataAdaptorBase.saveState(UIDataAdaptorBase.java:1554)
    at org.richfaces.component.UIDataTable.saveState(UIDataTable.java:181)
    at org.richfaces.component.html.HtmlDataTable.saveState(HtmlDataTable.java:1361)
    at javax.faces.component.UIComponentBase.processSaveState(UIComponentBase.java:1103)

当您<rich:dataTable>要保存组件的状态时,此问题似乎很明显。这又表明该组件的同一实例正在由多个线程访问。这是不对的,UIComponent该类从一开始就从来没有被设计为线程安全的。这反过来表明所讨论的组件实例未按JSF规范的要求进行作用域限定。例如,当您binding用于将组件绑定到会话作用域或什至是应用程序作用域的bean或更糟糕的是静态字段时,可能会发生这种情况。

<x:someComponent ... binding="#{nonRequestScopedBean.someComponent}">

您应该在代码库中查找这样的组件,并通过确保bean是请求范围的,或通过对需求/问题使用不同的解决方案(您认为使用binding此方法是正确的解决方案)来进行相应的修复。



 类似资料:
  • 我的基于Web的Java EE应用程序基于以下技术: 框架:Struts 2.0 服务器:Tomcat 6.0 前端UI:JSP、JSTL/Struts标记、HTML 数据库:Microsoft SQL Server 9.00.2047.00 语言:核心java、XML、XSLT。 现在我面临的问题是,我的web应用程序的某些进程将消耗更多的CPU使用量。有时我的Tomcat服务器会使用100%的

  • 问题内容: 如果我有这样的Java代码: 并在调试中运行它,我可以看到所有这些线程(在取消之后)仍在运行,所以它们也占用了我的内存吗?如果是的话,我怎么能完全销毁那些线程? 问题答案: 调用您的线程,仅此而已。因此,您需要在您的方法中正确处理它。对于您的简单情况,您的线程将完成其执行,并且它们的对象将由GC清除。

  • 问题内容: 假设您的Java程序占用了100%的CPU。它有50个线程。您需要查找哪个线程有罪。我没有找到可以提供帮助的工具。当前,我使用以下非常耗时的例程: 运行,其中pid是Java进程的进程ID。找到它的简单方法是运行JDK-中包含的另一个实用程序。最好将jstack的输出重定向到文件。 搜索“可运行”线程。跳过那些在套接字上等待的对象(由于某些原因,它们仍被标记为可运行)。 重复步骤1和2

  • 我在服务器上运行一个Java软件,24小时/天。今天早些时候(在服务器区域设置的午夜后几个小时检测到,这是值得注意的,因为它是本月的第一天),我收到了作为客户端连接到该软件的用户报告,称该软件突然变得不可用。JVM从未被中断或重新启动。它上一次重启是在几天前,从那以后它一直正常运行(使用大约5%或更少的CPU,这是正常的)。 这一次,当我检查该进程时,它实际上是在吞噬它可以从服务器上运行的其他应用

  • 问题内容: 我有一个Java应用程序, 我不能编辑 启动一个具有此方法: 我想在某个时间点停止它。如果我使用它不起作用。如果我使用它,则可以使用,但是不建议使用此方法(因此不建议使用该方法,因为在新版本中可能会将其从JVM中删除)。 如何在Java中停止此类不间断线程? 问题答案: 您可以使用检查变量来实现中断方法。 首先,使用易失性检查变量作为: 接下来,将您的线程定义为依赖于此变量。 接下来定

  • 所以从一开始:当计算机启动时,引导线程(通常是处理器0中核心0中的线程0)就开始从地址0xFFFFFFF0中提取代码。所有剩下的CPU/核都处于特殊的Hibernate状态,称为等待-SIPI(WFS)。 然后,在OS加载后,它开始管理进程,并在CPU/核之间调度它们,通过高级可编程中断控制器(APIC)向WFS中的每个线程发送一个特殊的处理器间中断(IPI)(启动IPI)。SIPI包含该线程应该