1

ページに10個のグラフがあり、pollコンポーネントを使用して1分ごとに更新しています。しかし、1時間後、FirefoxとChromeが1 GBを超えるメモリを取得し、Firefoxがクラッシュすることもあります。

これはprimefacesチャートによって引き起こされたメモリリークですか?どうすれば問題を解決できますか?

サンプルアプリケーションのソースコードは次のとおりです。

このコードでは、問題をより早く確認するために、間隔が3秒に設定されています。

<h:body>

    <h:form id="timerForm">
        <p:poll interval="3" widgetVar="timer" update=":chartPanel" autoStart="true" /> 
    </h:form>
    <p:panelGrid columns="2" id="chartPanel">

        <p:lineChart id="chart1" value="#{chartController.model}"
                             legendPosition="nw" style="height:200px;width: 500px;" minY="0" />
        <p:lineChart id="chart2" value="#{chartController.model}"
                             legendPosition="nw" style="height:200px;width: 500px;" minY="0" />
        <p:lineChart id="chart3" value="#{chartController.model}"
                             legendPosition="nw" style="height:200px;width: 500px;" minY="0" />
        <p:lineChart id="chart4" value="#{chartController.model}"
                             legendPosition="nw" style="height:200px;width: 500px;" minY="0" />
        <p:lineChart id="chart5" value="#{chartController.model}"
                             legendPosition="nw" style="height:200px;width: 500px;" minY="0" />
        <p:lineChart id="chart6" value="#{chartController.model}"
                             legendPosition="nw" style="height:200px;width: 500px;" minY="0" />

    </p:panelGrid>

</h:body> 

そしてここに豆があります:

@Named
@RequestScoped
public class ChartController {

static final Logger log = Logger.getLogger(ChartController.class.getName());

@PostConstruct
private void init() {
}

private ChartSeries getData(String label) {
    ChartSeries data = new ChartSeries();
    data.setLabel(label);
    for (int i = 1; i <= 20; i++) {
        data.set(i, Math.random() * 1000);
    }
    if (data.getData().isEmpty()) {
        data.set(0, 0);
    }
    log.log(Level.INFO, "Chart loaded for :{0}", label);
    return data;
}

public CartesianChartModel getModel() {
    CartesianChartModel chartModel = new CartesianChartModel();
    chartModel.addSeries(getData("Data 1"));
    chartModel.addSeries(getData("Data 2"));
    chartModel.addSeries(getData("Data 3"));
    return chartModel;
}
}

ブラウザを閉じると、メモリが完全に解放されます。ダウンロードするソースコードは次のとおりです。ソースコードをアップロードしました。これはMavenプロジェクトです。ダウンロードして、IDEで開き、アプリサーバーにデプロイします。

https://dl.dropbox.com/s/secmuo7vjasdaue/chart-bug.zip?dl=1

4

1 に答える 1

2

コンポーネントは、更新する前にリソースを破棄しません。これはバージョン3.3.1のバグであり、3.4で修正されていることがわかりました-SNAPSHOT

参照は次のとおりです。

http://forum.primefaces.org/viewtopic.php?f=3&t=18286&hilit=chart+memory+leak

http://code.google.com/p/primefaces/issues/detail?id=4183

于 2012-07-25T06:27:40.453 に答える