我第一次使用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)
答案 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的新区域 - 默认情况下是垃圾收集。