【问题标题】:Servlet called from Icefaces webapp creates constantly high CPU usage on client从 Icefaces webapp 调用的 Servlet 在客户端创建持续高 CPU 使用率
【发布时间】:2011-05-23 22:20:06
【问题描述】:

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

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

我不知道这是怎么发生的......

有没有办法分析/调试浏览器以找出导致cpu消耗的原因?

更新:

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

此外,当我在应用程序中注销时,CPU 使用率再次恢复正常!

更新:

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

POST http://localhost/webapp/block/receive-updated-views

来来去去。必须检查这个...

更新: 好的,我找到了一个 iceface thread (带有相应的 iceface jira 错误),但 bugtracker 指出这应该已经修复了......不知何故不适合我的情况!

【问题讨论】:

  • 问题是否仅取决于 Excel 或 PDF 文档?也就是说,如果您从另一台没有 Java 或 Servlets 的服务器上提供服务?如果是这样,这个问题不需要[java]和[servlets]标签。
  • 谢谢。它肯定与使用 servlet 和 icefaces 的 web 应用程序有关。我的 Excel 下载或浏览器没有任何其他问题。

标签: java performance jsf servlets icefaces


【解决方案1】:

您是否尝试过 FindBugs 或其他工具进行静态代码分析? http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java

【讨论】:

    【解决方案2】:

    如果 CPU 消耗确实来自浏览器,那么您将无能为力 - 它是 PDF 或 excel 查看器。

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

    【讨论】:

    • 谢谢。 CPU 消耗发生在浏览器中 - 而不是在服务器上!而且当我下载文件时也会发生这种情况,我想它不能是浏览器插件或查看器!
    【解决方案3】:

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

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


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

    【讨论】:

    • 谢谢。由于它是一个二进制文件,我确实不明白它为什么会发生。而且由于它发生在不同的机器上,它与 Web 应用程序有关,绝对与硬盘无关。
    • 再次感谢。实际上我没有使用commandButton,而是一个普通的html a href
    • 好吧,这就是 IceFaces 自己的古怪之处。由于我没有使用 IceFaces,所以无法给出更详细的答案。至少我的 Firebug 建议已帮助您确定根本原因 :)
    【解决方案4】:

    问题已解决(实际上它更像是一种解决方法)。

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

    public void exportToExcel(ActionEvent e) {
       JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(),  "window.open (\"downloadServlet.dl?contentType=excel\",\"report\")");
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多