我第一次在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中,我使用<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)发布于 2015-01-20 21:36:24
首先,试着增加你的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?
最后,考虑升级到Java8,因为它消除了PermGen空间的概念。取而代之的是,数据要么成为堆的一部分(比如interned ),要么成为一个名为Metaspace的新区域--默认情况下是垃圾收集。
https://stackoverflow.com/questions/28042858
复制相似问题