首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFreeChart - Java内存泄漏

JFreeChart - Java内存泄漏
EN

Stack Overflow用户
提问于 2015-01-20 18:20:20
回答 1查看 393关注 0票数 1

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

代码语言:javascript
复制
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;
}

在我的操作中,我像这样显示图表:

代码语言:javascript
复制
response.setContentType("image/png");
ServletOutputStream outputStream = response.getOutputStream();
ChartUtilities.writeChartAsPNG(outputStream, chart, 900, 450);
outputStream.close();

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

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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2015-01-20 21:36:24

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

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

代码语言:javascript
复制
-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

但是,这会使垃圾收集变得慢得多,因此不适合高负载系统(并且不适用于Java 7及更高版本)。

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

如果您确实有泄漏问题,最好的选择是找到原因并解决它。使用像jmap这样的工具为您提供一个可能导致问题的候选人的想法:

代码语言:javascript
复制
jmap -permstat <pid>

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

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

最后,考虑升级到Java8,因为它消除了PermGen空间的概念。取而代之的是,数据要么成为堆的一部分(比如interned ),要么成为一个名为Metaspace的新区域--默认情况下是垃圾收集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28042858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档