java - JFreeChart - Java 内存泄漏

标签 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)

最佳答案

首先,尝试增加 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 空间的概念。相反,数据要么成为堆的一部分(例如内部字符串),要么成为称为元空间的新区域 - 默认情况下会进行垃圾收集。

关于java - JFreeChart - Java 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042858/

相关文章:

java - 从spring-data-jdbc的 "Entities"生成脚本sql

java - 如何在 xpath webdriver java 中转义反斜杠

java - JBoss7 是否允许 Hibernate 3 xml 配置?

java - 绘制多个函数时如何消除一组重复的 X 值?

java - jstockchart 添加第三个显示

java - 使用 Java 客户端库连接到 YouTube Data API v3 时出现问题 - 示例代码已过时?

java - 部署 SOAP 客户端时解决架构位置问题

java - 为什么我的 JSF 示例不起作用?

java - 在运行时更改 XYSeries 的 key

使用 Java ASM 的 java.lang.VerifyError 错误