JFreeChart-Java泄漏内存

JFreeChart-Java泄漏内存,java,jboss,jfreechart,struts-1,Java,Jboss,Jfreechart,Struts 1,我第一次在struts1、java6、jboss4中使用Jfreechart(Jfreechart-1.0.13.jar)。 我使用以下代码创建图表: private JFreeChart getJfreeChart(int product, int msg) { DefaultPieDataset dpd = new DefaultPieDataset(); dpd.setValue("product", product); dpd.setVa

我第一次在struts1、java6、jboss4中使用Jfreechart(Jfreechart-1.0.13.jar)。 我使用以下代码创建图表:

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中,我使用
显示图表

当我执行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)
java.lang.OutOfMemoryError:PermGen空间
位于javax.swing.UIManager.initialize(未知源)
在javax.swing.UIManager.maybeInitialize(未知源代码)
位于javax.swing.UIManager.getDefaults(未知源)
位于javax.swing.UIManager.getColor(未知源)
在org.jfree.chart.JFreeChart.(JFreeChart.java:261)
在org.jfree.chart.ChartFactory.createPieChart3D(ChartFactory.java:763)上

首先,尝试增加永久发电机空间。如果是真正的泄漏,您仍然会看到相同的错误,但至少应该延迟它

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

-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
但是,这会使垃圾收集速度大大降低,因此不适合高负载系统(并且不适用于Java7以后的版本)

如果您在JBoss(或任何其他应用服务器)中重复执行“热部署”,请尽量避免这种情况,而改为冷部署(如果可能)。如果不是,那显然不是问题的原因

如果确实存在泄漏问题,最好的选择是找到原因并解决它。使用类似jmap的工具,为可能导致问题的候选人提供想法:

jmap -permstat <pid>
jmap-permstat
文件:

另见这个问题:


最后,考虑升级到java 8,因为它不需要PrimGEN空间的概念。相反,数据将成为堆的一部分(如插入的字符串)或称为Metaspace的新区域,默认情况下,Metaspace是垃圾收集的。

内存不足不一定表示“泄漏”。您的PermGen空间设置为多大?那个JVM实例上还运行着什么?@Mikaveli:我有一个配置:-XX:PermSize=258M-XX:MaxPermSize=512M只有应用程序在JVM实例上运行。permGen空间的增加不会改变任何东西;我有同样的错误(内存不足)。我还使用了这些选项
(-XX:+cmsclasssunloadingEnabled-XX:+cmsclasssweapingEnabled)
,但不幸的是,结果是一样的。我已经使用JavaVisualVM、jmap、jhat找到了内存泄漏的原因,但目前没有结果。这很奇怪,因为有时候我没有例外,你需要使用CMS垃圾收集器,这些选项才会有效果。请参阅关于Java 8的更新。