怎么使用的内存是什么意思?
两个关键的地方应该是new chart 和 保存png文件的地方吧,用的分别是:
JFreeChart chart = ChartFactory.createLineChart(prop.getPropertyName() + MooyaaFileUtil.PRICEIMAGE_DEFAULT_TITLE,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_LABEL_X,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_LABEL_Y, ds, PlotOrientation.VERTICAL, false, false, false);ChartUtilities.writeChartAsPNG(fos_jpg, chart, MooyaaFileUtil.PRICEIMAGE_DEFAULT_WIDTH,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_HEIGHT);
两个关键的地方应该是new chart 和 保存png文件的地方吧,用的分别是:
JFreeChart chart = ChartFactory.createLineChart(prop.getPropertyName() + MooyaaFileUtil.PRICEIMAGE_DEFAULT_TITLE,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_LABEL_X,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_LABEL_Y, ds, PlotOrientation.VERTICAL, false, false, false);ChartUtilities.writeChartAsPNG(fos_jpg, chart, MooyaaFileUtil.PRICEIMAGE_DEFAULT_WIDTH,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_HEIGHT);
楼主使用Aapche +Tomcat 试试看。
我想你应该是用的一个循环去生成几千个png图片,那你在循环中生成完一个图片以后,一般要运行
out.flush();
out.close();out是输出流。并且你在循环中生成的对象都赋值为null,
private void savePropertyImage(Properties prop, DefaultCategoryDataset ds) {
FileOutputStream fos_jpg = null;
try { JFreeChart chart = ChartFactory.createLineChart(prop.getPropertyName() + MooyaaFileUtil.PRICEIMAGE_DEFAULT_TITLE,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_LABEL_X,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_LABEL_Y, ds, PlotOrientation.VERTICAL, false, false, false); chart.setBackgroundPaint(java.awt.Color.WHITE); // 可选,设置图片背景色 CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(Color.WHITE);
plot.setRangeGridlinePaint(Color.LIGHT_GRAY); // customise the range axis...
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setAutoRangeIncludesZero(false);
// customise the renderer...
LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
renderer.setBasePaint(Color.WHITE);
renderer.setBaseLinesVisible(true);
renderer.setBaseShapesVisible(true);
renderer.setSeriesPaint(0, new Color(239,200,104));
renderer.setSeriesShape(0, new Ellipse2D.Double(-3, -3, 6, 6));
renderer.setSeriesStroke(0, new BasicStroke(2.0f));
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.CENTER,
TextAnchor.CENTER_RIGHT,
TextAnchor.CENTER_RIGHT,0);
renderer.setBasePositiveItemLabelPosition(itemlabelposition);
//renderer.setBaseToolTipGenerator(null); String fileDir = MooyaaFileUtil.getPropertyFilePath(prop.getPropertyId().toString());
fos_jpg = new FileOutputStream(fileDir + prop.getPropertyId().toString() +".png");
ChartUtilities.writeChartAsPNG(fos_jpg, chart, MooyaaFileUtil.PRICEIMAGE_DEFAULT_WIDTH,
MooyaaFileUtil.PRICEIMAGE_DEFAULT_HEIGHT);
chart = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
}
}
}
和内存的使用方法无关吧。
主要还是jfreechart的一些细节。
String hql = "from Properties p where p.status=1";
List<Properties> props = this.getDao().select(hql);
for (Properties prop : props) {
DefaultCategoryDataset ds = this.getPropertyDataset(prop.getPropertyId());
this.savePropertyImage(prop, ds);
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch(Exception e) {
e.printStackTrace();
}。
我估计是你的数据有问题(重复的值)...
并且在循环中,每次生成图片以后,都DefaultCategoryDataset = null
sleep(2000)没什么用,只是生成之后停一下,生成的太快容易瞬时内存增大很多。
我已经在用完dataset之后设置为null了。
下面是getPropertyDataset方法的代码:
public DefaultCategoryDataset getPropertyDataset(Integer propertyId) {
Calendar now = Calendar.getInstance();
Date endDate = now.getTime();
now.set(Calendar.MONTH, now.get(Calendar.MONTH) - 12);
Date startDate = now.getTime();
DetachedCriteria dc = DetachedCriteria
.forClass(PropertyAveragePrice.class);
dc.createAlias("properties", "prop");
dc.add(Restrictions.eq("prop.propertyId", propertyId));
dc.add(Restrictions.ge("statDate", startDate));
dc.add(Restrictions.le("statDate", endDate));
List res = this.getDao().selectObjects(dc);
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
if (res != null && res.size() > 0) {
SimpleDateFormat sdf = new SimpleDateFormat("yy/MM");
for (int i = 0; i < res.size(); i++) {
PropertyAveragePrice pap = (PropertyAveragePrice) res.get(i);
dataset.addValue(pap.getPrice(), "", sdf.format(pap
.getStatDate()));
}
}
return dataset;
}
建议楼主单步调试一下你的程序,看程序运行到哪步,内存会升高
你用是什么方式做的数据库查询?你的这种方式我没见过。
有没有需要特别注意的地方,给个提示啊。
单步调试一下你的程序,看程序运行到哪步,内存会升高 并且没有回落。先要找到问题才能解决问题。