JFreeChart - Java 堆空间问题

2024-03-18

我是第一次使用 JFreeChart,并且使用 TimeSeriesCollection() 创建 TimeSeriesChart。

我的数据库查询结果集就是全部。大约1000条记录。我在用org.jfree.date.time.Minute.Minute(int min.....)对象将其添加到 TimeSeries 对象。

我有一个 JFrame,我直接在其上添加 ChartPanel。用户将提供新的输入参数并使用新的数据集重新加载图表数据。所以我每次之前都会清理干净reload通过在方法中调用以下内容

            dataset.removeAllSeries();
            chart.removeLegend();
            chart.getRenderingHints().clear();
            cp.getChartRenderingInfo().setEntityCollection(null);
            cp.removeAll();
            cp.revalidate();

输出是完美的。但我注意到,在“在 Eclipse 中运行几次”程序后,我看到以下有关 Java 堆空间的错误消息。有时我还在任务管理器中看到,即使数据集非常小(100 条记录),程序也会占用 PC 内存。

Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
at sun.util.calendar.Gregorian.newCalendarDate(Gregorian.java:67)
at java.util.GregorianCalendar.<init>(GregorianCalendar.java:575)
at java.util.Calendar.createCalendar(Calendar.java:1012)
at java.util.Calendar.getInstance(Calendar.java:964)
at org.jfree.chart.axis.DateTickUnit.addToDate(DateTickUnit.java:238)
at org.jfree.chart.axis.DateAxis.refreshTicksHorizontal(DateAxis.java:1685)
at org.jfree.chart.axis.DateAxis.refreshTicks(DateAxis.java:1556)
at org.jfree.chart.axis.ValueAxis.reserveSpace(ValueAxis.java:809)
at org.jfree.chart.plot.XYPlot.calculateDomainAxisSpace(XYPlot.java:3119)
at org.jfree.chart.plot.XYPlot.calculateAxisSpace(XYPlot.java:3077)
at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:3220)
at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1237)
at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1677)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1491)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1422)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:294)
at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:786)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:694)
at javax.swing.RepaintManager.access$700(RepaintManager.java:41)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1636)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:607)
at java.awt.EventQueue$1.run(EventQueue.java:605)
at java.security.AccessController.doPrivileged(Native Method)

我的申请如下:

我有一个 JFrame,在向其传递图表后,我直接在其上添加 ChartPanel。

chart = ChartFactory.createTimeSeriesChart("Peak monitor", , "Time: Zoom in", "# of Requests Logged", createDataset(from,to), true, false, false);

            chartpanel = new ChartPanel(chart);

            FramePanel.this.add(cp);


            validate();

Here 创建数据集(从,到)是一种方法

 private TimeSeriesCollection createDataset(Date from, Date to) {
    dataset.addSeries(controller.getStuff(from, to));
    return dataset;
}

getStuff在 SwingWorker 线程内调用(DIBkgd 方法)

 public TimeSeries getStuff(Date from, Date to) {
    s1 = new TimeSeries("Log Requests");

    final Date from1 = from;
    final Date to1 = to;

    progressDialog.setVisible(true);

    sw = new SwingWorker<Void, Integer>() {

        @Override
        protected Void doInBackground() throws Exception {

            if (db.getCon() == null) {
                db.connect();
            }
            Arrlst2.clear();
            Arrlst2= db.getDataDB(from1, to1);

            for (Qryobjects x : Arrlst2) {                  
              s1.add(new Minute(x.getMinute(), x.getHour(), x.getDay(), x.getMonth(), x.getYear()), x.getCount());
            }

            System.out.println("finished fetching data");
            return null;
        }

        @Override
        protected void done() {
            progressDialog.setVisible(false);
        }
    };
    sw.execute();
    return s1;

}

在我的数据库类中获取数据库被执行:

 public List<Qryobjects> getDataDB(Date from, Date to) {

    PreparedStatement select;
    ResultSet rs;

    String selectSql = "Select Sum(Cnt) Cid, Hr, Min, Dat from (Select count(H.Request_Id) Cnt , To_Char(H.Timestamp,'HH24') HR, To_Char(H.Timestamp,'mm') MIN, To_Char(H.Timestamp,'MM-dd-yyyy') DAT From Status_History H Where H.Timestamp Between ? And ? Group By  H.Request_Id,  H.Timestamp Order By H.Timestamp Asc) Group By Hr, Min, Dat order by Dat asc";

    try {
        select = con.prepareStatement(selectSql);

        select.setDate(1, from);
        select.setDate(2, to);

        rs = select.executeQuery();

        System.setProperty("true", "true");

        while (rs.next()) {

            int cnt = rs.getInt("cid");

            int hour = Integer.parseInt(rs.getString("Hr"));
            int min = Integer.parseInt(rs.getString("Min"));
            int month = Integer.parseInt(rs.getString("dat").substring(0, 2));
             int day = Integer.parseInt(rs.getString("dat").substring(3, 5));
            int year = Integer.parseInt(rs.getString("dat").substring(6, 10));

             Arrlst1.add(new Qryobjects(cnt, hour, min, day, month,year));

        }
        rs.close();

    } catch (SQLException e) {
        e.printStackTrace();
    }

    return Arrlst1;
}

作为参考,我分析了两个长时间运行的时间序列DTSCTest https://stackoverflow.com/a/5048863/230513 and MemoryUsageDemo http://www.jfree.org/jfreechart/samples.html。为了夸大规模,我人为地使用了一个小堆,如下所示。在每种情况下,我都看到定期垃圾收集返回基线的典型锯齿模式,如图所示here https://stackoverflow.com/a/5918785/230513。相比之下,这种病态example https://stackoverflow.com/a/6310284/230513显示因不可恢复资源而消耗的内存呈长期上升趋势。



$ java -Xms32m -Xmx80m -cp build/classes:dist/lib/* chart.DTSCTest
$ java -Xms32m -Xmx80m -jar jfreechart-1.0.14-demo.jar
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JFreeChart - Java 堆空间问题 的相关文章

随机推荐

  • 在 R 中查找特殊字符的第三次出现并删除之前的所有内容

    我有这个包含 URL 的示例向量 我的目标是获取URL的路径 sample1 lt c http tercihblog com indirisu docugard http funerariagomez com js ggogle a201
  • SQL 查询选择每组具有最大值的每一行

    我对 SQL 很陌生 这个问题让我难住了 你能帮我解答这个问题吗 我有以下 2 个表 表 1 问题表 Id RunId Value 1 1 10 2 1 20 3 1 30 4 2 40 5 2 50 6 3 60 7 4 70 8 5 8
  • 如何将sql查询结果转储到文件中

    好吧 我现在的情况是 我需要将 sql 查询的结果转储到文件中 这是出于备份目的 我尝试从终端运行以下命令 mysql e select from products where brand id 5 u root p database na
  • WTSRegisterSessionNotification 有时在 XP home 启动时不起作用

    我正在使用该函数 消息来检查工作站是否已锁定 现在我的应用程序位于启动文件夹中 它在 XP pro 上运行没有任何问题 但由于我在 XP home 上使用该程序 WTSRegisterSessionNotification 在启动时大约有
  • 一起使用facet_grid和facet_wrap

    我正在尝试使用创建图表facet wrap with a facet grid在每个包裹的方面内 但我无法做到 有什么建议么 例如 如果我要对 2 个数量的月平均值进行同比比较 我希望 2 个面 每个数量一个 每个月份的 5 个数量方面都有
  • Flash 源代码控制 - 最佳实践

    我现在正在开发一个 Flash 项目 我不得不迫使设计人员使用我们的源代码控制存储库 SVN 来帮助管理和跟踪项目 让他完全接受源代码控制的好处是一场艰苦的战斗 但它正在到来 除了我是唯一一个参与 Flash 项目的项目之外 我以前从未在
  • 无法创建目录 /home/hadoop/hadoopinfra/hdfs/namenode/current

    我收到错误 Cannot create directory home hadoop hadoopinfra hdfs namenode current 尝试在我的本地 Mac 上安装 hadoop 时 这可能是什么原因 仅供参考 我将我的
  • 更新嵌套字典中的值 - Python

    我创建了一个字典 如下所示 gP dict fromkeys range 6 a None b None c None d None 现在 当我尝试修改一个值时 gP 0 a 1 由于某种原因 所有的值a 不管它们属于哪个键 更改为1 如下
  • 为什么我的 UDP 广播失败?

    我正在尝试发送 UDP 广播 但wireshark 没有报告任何流量 这是执行发送的代码片段 void SendBroadcast String ip 255 255 255 255 int port 30718 String messag
  • 在 shell 脚本中扩展变量

    我有一个需要循环的查询 query select dbserver as server while read dbserver username password dbname type do mysql h dbserver u user
  • 如何使用 VBA 将数据从关闭的工作簿(保持关闭状态)复制到主工作簿中?

    我需要使用 VBA 将数据从关闭的工作簿复制到主工作簿中 而不打开它们 I use Workbooks Open从 4 6 个文件开始 每个需要打开的文件都会大大减慢复制操作的速度 我需要高效的 VBA 代码来复制数据 而无需打开每个文件
  • Azure 存储非经典 (V2) - 如何配置自定义域

    在新的 Azure 门户中 有 2 个存储帐户 非经典帐户和经典帐户 因为我认为经典就是旧版本 所以我选择非经典 问题是 我无法在新门户上配置自定义域 它将我重定向到旧的 azure 门户 manage windowszuare com 问
  • 隐藏包中的模块导入

    我有一个小包 有一些依赖项 例如 pandas 和 gensim 文件结构是这样的 package init py agg clean py In the init py文件 我有import agg clean所以我能够以链式方式访问这些
  • 嵌入式 Python 应用程序中 Py_Finalize 期间发生致命错误

    感谢您的帮助 这个问题的变体已经被问过很多次 但我还没有找到完整的答案 我正在使用 MS MFC 类将嵌入式 Python 3 4 2 添加到用 C 编写的现有模拟器工具中 该应用程序是多线程的 以便用户可以执行Python脚本并与模拟器系
  • 列出 pyspark 中加载的所有其他 jar

    我想查看我的 Spark 上下文正在使用的罐子 我在Scala中找到了代码 spark shell jars master spark datasci 7077 jars opt jars xgboost4j spark 0 7 jar w
  • CFBundleShortVersionString 必须是最多三个非负整数的以句点分隔的列表

    将我的应用程序提交到应用程序商店时 我收到此错误 这是我的 info plist 文件中的相关部分
  • 神经网络需要多少个纪元来学习平方? (包括测试结果)

    好吧 首先我要说的是 我很清楚这取决于很多因素 我正在向有经验的人寻求一些一般准则 我的目标是not制作一个可以为我计算数字平方的神经网络 但我认为这将是一个很好的实验 看看我是否正确实现了反向传播算法 这看起来是个好主意吗 无论如何 我担
  • 多模块 Maven 项目中的 log4j

    如何在多模块 Maven 项目中实现 log4j 我是否将 log4j properties 文件添加到每个子模块的 src main resources 目录中 如果是这样 我是否必须为每个文件附加器指定不同的输出文件 或者有没有一种方法
  • db2 查询时间戳数据类型的奇怪行为

    我想查询 db2 中的时间戳数据类型 我在下面写了查询 Select from sample where LASTMODIFIEDDATE timestamp 2012 04 03 07 59 50 我没有得到上述查询的任何结果 然后我尝试
  • JFreeChart - Java 堆空间问题

    我是第一次使用 JFreeChart 并且使用 TimeSeriesCollection 创建 TimeSeriesChart 我的数据库查询结果集就是全部 大约1000条记录 我在用org jfree date time Minute M