Java 从Icefaces webapp调用的Servlet在客户端上产生持续的高CPU使用率

Java 从Icefaces webapp调用的Servlet在客户端上产生持续的高CPU使用率,java,performance,jsf,servlets,icefaces,Java,Performance,Jsf,Servlets,Icefaces,我正在开发一个web应用程序(使用JBoss和Icefaces),它使用Servlet创建Excel或PDF文件并将其发送到浏览器 但是在调用servlet之后,我遇到了性能问题,导致浏览器的CPU消耗一直很高(~50%)。在不同的机器上测试Firefox和Internet Explorer。在servlet被调用后,cpu的高使用率会有一点延迟(半分钟),并保持高使用率(直到我关闭浏览器或重新加载页面)。 我是下载创建的文件还是直接打开它都没有区别 我不知道这怎么会发生 是否有方法分析/调试浏

我正在开发一个web应用程序(使用JBoss和Icefaces),它使用Servlet创建Excel或PDF文件并将其发送到浏览器

但是在调用servlet之后,我遇到了性能问题,导致浏览器的CPU消耗一直很高(~50%)。在不同的机器上测试Firefox和Internet Explorer。在servlet被调用后,cpu的高使用率会有一点延迟(半分钟),并保持高使用率(直到我关闭浏览器或重新加载页面)。 我是下载创建的文件还是直接打开它都没有区别

我不知道这怎么会发生

是否有方法分析/调试浏览器以找出导致cpu消耗的原因

更新:

我发现这肯定与Icefaces网络应用程序有关。当我用javascript调用替换指向servlet的直接html链接并在新窗口(使用window.open)中打开servlet时,我可以毫无问题地下载创建的文件

同样,当我在我的应用程序中注销时,CPU使用率又恢复正常

更新:

好的,现在Firebug帮助了我:在调用servlet之后,我可以在Firebug控制台中看到每毫秒有XMLHtppRequests。现在我可以了解CPU的使用情况了

POST http://localhost/webapp/block/receive-updated-views
一个接一个。我必须检查一下这个

更新:
好的,我发现了一个(带有相应的iceface jira bug),但是bugtracker声明这应该已经修复了。。。不知怎么的,我的案子不适合

浏览器不运行servlet。浏览器运行/显示servlet生成的输出。这是导致高负载的输出。根据目前已知的少量信息,很难判断输出有什么问题。可以提供很多关于网络浏览器中发生的事情的见解

通常,一个非常大的HTML表或一段低效的JavaScript代码会消耗大量CPU/内存资源。但对于像XLS/PDF这样的二进制文件下载,这实际上不应该发生。原因可能更深。在硬盘上进行文件到文件复制时,您是否看到大量资源使用情况?如果是这样,则可能是硬盘坏了,或者是硬盘驱动程序坏了,或者是硬盘DMA被关闭了



更新:根据您在Firebug帮助下的调查,您似乎正在使用IceFaces的
ice:commandButton
ice:commandLink
下载文件。用普通的JSF
h:commandButton
h:commandLink
替换它们,这样它就不会不必要地生成负责此操作的JS代码。

您是否尝试过FindBugs或其他静态代码分析工具?

如果CPU消耗真的来自浏览器,那么你对此无能为力-它是PDF或excel查看器

如果服务器在同一台机器上,并且cpu负载来自servlet,那么必须对其进行优化。为我们提供代码。

问题已解决(实际上这更像是一种变通方法)

这是一个冰面问题,应该根据实际情况进行修复。 但由于它实际上仍然存在,我只能通过在新的窗口中调用servlet来修复它,该窗口由javascript创建。(正如我编辑的问题中已经提到的)。 这真的不是一个好的解决方案,还有一个缺点,浏览器不能阻止弹出窗口。 但这也是我在网上见过好几次的解决方案(比如)


问题是否仅取决于Excel或PDF文档?也就是说,如果您从另一台没有Java或servlet的服务器提供服务?如果是这样,这个问题不需要[java]和[servlets]tags.Thx。它与使用servlet和icefaces的webapplication密切相关。Excel下载或我的browser.Thx没有任何其他问题。由于它是一个二进制文件,我确实不明白为什么会发生这种情况。当它发生在不同的机器上时,它与web应用程序相关,而与硬盘无关。实际上,我并没有使用commandButton,而是使用一个简单的html和一个hrefOK,这就是IceFaces自己的奇怪之处。因为我不使用冰面,所以无法给出更详细的答案。至少我的萤火虫建议帮助你找到了根本原因:)Thx。CPU消耗发生在浏览器中,而不是服务器上!当我下载文件时,它也会发生,我想它不可能是浏览器插件或查看器!
public void exportToExcel(ActionEvent e) {
   JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(),  "window.open (\"downloadServlet.dl?contentType=excel\",\"report\")");
}