我们在JDK8_74 / Wildfly 9.0.1.Final中遇到了一些奇怪的(目前不可重现的)行为。在解析后请求的参数时,工作线程开始无限循环到本机方法PollArrayWrapper.poll0(long, int, long)
。该线程在一个内核上消耗100%的CPU负载。
mServlet.java:468 io.undertow.servlet.spec.HttpServletRequestImpl.getParameterValues(String)
HttpServletRequestImpl.java:679 io.undertow.servlet.spec.HttpServletRequestImpl.parseFormData()
...
SelectorImpl.java:86 sun.nio.ch.PollSelectorImpl.doSelect(long)
PollSelectorImpl.java:87 sun.nio.ch.PollArrayWrapper.poll(int, int, long)
PollArrayWrapper.java:115 sun.nio.ch.PollArrayWrapper.poll0(long, int, long)
有没有人见过这个?自2005年以来,它似乎在不同的场合出现在不同的项目中,并且已经多次报告为JDK Bug,并且已经标记为已修复。
有没有人知道,如何强制Wildfly在poll0
方法上使用超时?
亲切的问候, 乔纳森
答案 0 :(得分:0)
正如ctomc暗示的那样,这个问题很可能是一个未解决的jdk-bug。我们的软件在不同的执行环境中运行,我们在SLES 11.4.23系统上见过这个问题。
一种可能的解决方案是采用hystrix风格的线程封装:将关键调用封装在Callable
内,从而允许实现某种形式的看门狗/超时。