怎么使用的内存是什么意思?
两个关键的地方应该是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);

解决方案 »

  1.   

    一次生成几千个?到底是怎么生成的?是生成几千个png图片还是什么?如果是生成几千个ppng图片,你每生成完一个图片以后,就把相关的对象关闭。
      

  2.   

    想一次生成几千个png图片,我已经把tomcat的最大内存调到1G了,还是不行。关闭相关对象是什么意思?怎么关闭?我在用完chart对象之后把它设置成null了(chart = null)。Y轴上的值有重复的会有什么样的影响?
      

  3.   


    楼主使用Aapche +Tomcat 试试看。
      

  4.   


    我想你应该是用的一个循环去生成几千个png图片,那你在循环中生成完一个图片以后,一般要运行
    out.flush();
    out.close();out是输出流。并且你在循环中生成的对象都赋值为null,
      

  5.   

    目前使用的web服务器就是apache+tomcatout我也flush和close了。网上有人说要禁用jfreechart的tooltips和urls,我也禁掉了。
      

  6.   

    这个是生成图片的整个的代码。有一个循环调用这个方法批量生成图片。
    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) {
    }
    }
    }
      

  7.   

    取出来的数?你是指CategoryDataset?
      

  8.   

    也不能这么说,只想问问jfreechart的内存使用情况如何,如何节约内存的使用。
    和内存的使用方法无关吧。
    主要还是jfreechart的一些细节。
      

  9.   

    try {
    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();
    }。
      

  10.   

    jfreechart生成几k的数据点(线)图应该是没有问题的.
    我估计是你的数据有问题(重复的值)...
      

  11.   

    重复的值怎么讲?CategoryData里面的值?
      

  12.   

    Thread.sleep(2000); 这个有用吗?getPropertyDataset这个方法检查一下,
    并且在循环中,每次生成图片以后,都DefaultCategoryDataset = null
      

  13.   


    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;
    }
      

  14.   

    sleep(2000)没什么用,只是生成之后停一下,生成的太快容易瞬时内存增大很多。 这个说明你的内存释放有问题,
    建议楼主单步调试一下你的程序,看程序运行到哪步,内存会升高
    你用是什么方式做的数据库查询?你的这种方式我没见过。
      

  15.   

    感觉用jfreechart的人比较少啊,高手呢?
    有没有需要特别注意的地方,给个提示啊。
      

  16.   

    我们一直都是用jfreechar开发,但是没有一下子生成几千副图片的,所以没有碰到过你的问题,而且我认为这个不是jfreechar的问题,而是你的程序没有释放内存,按照我上面说的
    单步调试一下你的程序,看程序运行到哪步,内存会升高 并且没有回落。先要找到问题才能解决问题。