JSF,PrimeFaces,For Loop绘制多个LineCharts导致内存泄漏

时间:2018-03-06 07:00:56

标签: jsf primefaces

我面临与内存消耗相关的问题,绘制60个LineCharts将消耗超过600 MB的Ram。

使用过的软件:

  • firefox(第52.6节)和铬(第64.0.3282节)
  • primeface 6.2
  • java 1.8

问题描述:

  • 第一次打开网站后立即出现问题
  • 单击webbroser的“重新加载当前页面”按钮(刷新网站)后出现第二个问题。每次都会聚合总内存利用率。例如
    • 在加载网站之前,内存使用量为2,3 Gig
    • 首次加载网站后,内存利用率跃升至3,0 Gig
    • 第一次刷新网站后,内存利用率跃升至3,8 Gig
    • 刷新第二次后,内存利用率跃升至4,4 Gig

内存问题出现在webbrowser进程(客户端站点)中。在另一台服务器上运行的Wildfly运行良好(服务器端)。

代码和UI说明:

enter image description here

bean代码段(请求范围)

    public List<LineChartModel> getDataModelShowingThePortfolioOfThisInvestor () {
    //return this.getDataModelShowingThePortfolioOfThisInvestor("Warren Buffett");

    listModel.clear();

    for (int i=0;i<60;i++){
        data = new ChartSeries();
        model = new LineChartModel();

        data.set("2004", 1000);
        data.set("2005", 1170);
        data.set("2006", 660);
        data.set("2007", 1030);
        data.set("2008", 1170);
        data.set("2009", 660);
        data.set("2010", 1030);

        model.addSeries(data);

        model.setTitle(new Integer(i).toString());
        model.setLegendPosition("e");
        model.setLegendPlacement(LegendPlacement.OUTSIDEGRID);
        model.setShowPointLabels(false);
        model.setZoom(true);
        //Y-Axis settings
        Axis yAxis = model.getAxis(AxisType.Y);
        yAxis.setLabel("Stock Volume");
        //X-Axis settings
        DateAxis xAxis = new DateAxis();
        xAxis.setTickAngle(-50);
        xAxis.setTickFormat("%y %b");
        //add axes to model 
        model.getAxes().put(AxisType.X, xAxis);

        listModel.add(model);

    }

    return listModel;

}

jsf模板代码段

<h:html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
  <h:head>
    <script name="jquery/jquery.js" library="primefaces"></script>
    <title><ui:insert name="title"> Beta Application </ui:insert></title>
    <p:layout fullPage="true">
        <p:growl id="message"></p:growl>
        <p:layoutUnit position="center">
            <ui:insert name="center" />
        </p:layoutUnit>
    </p:layout>
   </h:head>
</h:html>

jsf code snippet

<h:html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:body>
    <ui:composition template="template.xhtml">
        <ui:define name="center">
               <ui:repeat var="model" value="#{primefaceChartController.getDataModelShowingThePortfolioOfThisInvestor()}" varStatus="status">
                    <p:chart type="line" model="#{model}" style="height:300px;"/>
               </ui:repeat>            
        </ui:define>
    </ui:composition>
</h:body>
</h:html>

当更改jsf代码段以排除模板时,刷新站点后将不再出现累积内存使用问题。内存利用率将是例如。

  • 在加载网站之前,内存使用量为2,4 Gig
  • 首次加载网站后,内存利用率跃升至3,1GG
  • 首次刷新网站后,内存使用率会暂时下降几秒钟然后增加到3.1 gig
  • 第二次刷新后,内存使用量会下降几秒钟,然后增加到3.1 gig

jsf代码段(已移除模板)

<h:html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:head>
    <script name="jquery/jquery.js" library="primefaces"></script>
</h:head>

<h:body>

    <ui:repeat var="model"
        value="#{primefaceChartController.getDataModelShowingThePortfolioOfThisInvestor()}"
        varStatus="status">
        <p:chart type="line" model="#{model}" style="height:300px;" />
    </ui:repeat>
</h:body>
</h:html>

1 个答案:

答案 0 :(得分:0)

我手动包含jQuery并将布局放在<h:head>标记中。这会导致每次点击“重新加载当前页面”后的累计总内存利用率。网页浏览器的按钮(刷新网站)。非常感谢Kukeltje的帮助