JFreeChart - Java泄漏内存

时间:2015-01-20 10:20:20

标签: java jboss jfreechart struts-1

我第一次使用jfreechart(jfreechart-1.0.13.jar)和struts1,java6,jboss4。 我使用此代码创建图表:

private JFreeChart getJfreeChart(int product, int msg) {

        DefaultPieDataset dpd = new DefaultPieDataset();
        dpd.setValue("product", product);
        dpd.setValue("msg", msg);

        JFreeChart chart = ChartFactory.createPieChart3D(null, dpd, true, false, false);

        PiePlot plot = (PiePlot) chart.getPlot();
        plot.setSectionPaint("product", new Color(51, 102, 153));
        plot.setSectionPaint("msg", new Color(160, 218, 230));

        plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}"));
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} : {1}"));

        return chart;
}

在我的行动中,我这样做是为了显示图表:

response.setContentType("image/png");
ServletOutputStream outputStream = response.getOutputStream();
ChartUtilities.writeChartAsPNG(outputStream, chart, 900, 450);
outputStream.close();

在我的jsp中,我使用<img src="MyAction.do" />来显示图表

当我执行getJfreeChart时,我注意到内存泄漏。 我的代码中有异常吗?

java.lang.OutOfMemoryError: PermGen space
    at javax.swing.UIManager.initialize(Unknown Source)
    at javax.swing.UIManager.maybeInitialize(Unknown Source)
    at javax.swing.UIManager.getDefaults(Unknown Source)
    at javax.swing.UIManager.getColor(Unknown Source)
    at org.jfree.chart.JFreeChart.<clinit>(JFreeChart.java:261)
    at org.jfree.chart.ChartFactory.createPieChart3D(ChartFactory.java:763)

1 个答案:

答案 0 :(得分:0)

首先,尝试增加PermGen空间。如果它是真正的泄漏,你仍然会看到同样的错误,但它至少应该延迟它。

另一个选择是允许类卸载:

-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

但是,这会导致垃圾收集速度变慢,因此不适合高负载系统(并且不适用于Java 7以上版本)。

如果您在JBoss(或任何其他应用服务器)中执行重复的“热部署”,请尝试避免这种情况并进行冷部署(如果可能)。如果没有,那显然不会成为问题的原因。

如果确实存在泄漏问题,最好的选择是查找原因并解决问题。使用像jmap这样的工具可以让您了解导致问题的可能候选人:

jmap -permstat <pid>

文档:http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html

另请参阅此问题:How to dump Permgen?

最后,考虑升级到Java 8,因为它消除了PermGen空间的概念。相反,数据将成为堆的一部分(例如实习的字符串)或称为Metaspace的新区域 - 默认情况下是垃圾收集。