使用JFreeChart显示 Java 虚拟机中的空闲内存量
因为需要使用JFreeChart动态显示出采集的数据,就看了这方面的资料!根据给出的例子,改了下啊,实时显示出内存大小!
import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.geom.Ellipse2D;import java.sql.Timestamp;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.Timer;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.DateAxis;import org.jfree.chart.axis.DateTickUnit;import org.jfree.chart.axis.NumberAxis;import org.jfree.chart.axis.NumberTickUnit;import org.jfree.chart.labels.StandardXYToolTipGenerator;import org.jfree.chart.plot.Marker;import org.jfree.chart.plot.ValueMarker;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;import org.jfree.data.time.Day;import org.jfree.data.time.Hour;import org.jfree.data.time.Minute;import org.jfree.data.time.Second;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.ui.RectangleAnchor;import org.jfree.ui.TextAnchor;public class MyMemoryChart extends JPanel {private static final long serialVersionUID = 1L;private TimeSeriesCollection dataCollection = null;private TimeSeries series = null;private JFreeChart chart = null;private XYPlot plot = null;private ChartPanel chartPanel = null;private int seconds_interval_of_X_axis = 30;private int tickUnit_second_Count = 1;private Marker vMarker = null;private Marker hMarker = null;public MyMemoryChart() {series = new TimeSeries("");series.setMaximumItemCount(100);dataCollection = new TimeSeriesCollection(series);createChart(dataCollection);chartPanel = new ChartPanel(chart);this.setLayout(new BorderLayout());this.add(chartPanel, BorderLayout.CENTER);}private void createChart(TimeSeriesCollection dataCollection) {chart = ChartFactory.createTimeSeriesChart("", "", "", dataCollection,false, // 是否显示图例(对于简单的柱状图必须是false)true, // 是否生成工具false // 是否生成URL链接);chart.getTitle().setFont(new Font("Dialog", Font.PLAIN, 10));chart.setTitle("No Data");plot = chart.getXYPlot();// 设置X轴特性DateAxis domainAxis = new DateAxis();GregorianCalendar gc = new GregorianCalendar();GregorianCalendar gc1 = gc;int year = gc.get(Calendar.YEAR);int month = gc.get(Calendar.MONTH);int day = gc.get(Calendar.DATE);int hour = gc.get(Calendar.HOUR_OF_DAY);int miniute = gc.get(Calendar.MINUTE);int second = gc.get(Calendar.SECOND);gc = new java.util.GregorianCalendar(year, month, day, hour, miniute,second + 10);second = second - seconds_interval_of_X_axis;gc1 = new java.util.GregorianCalendar(year, month, day, hour, miniute,second);domainAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));domainAxis.setRange(gc1.getTime(), gc.getTime());domainAxis.setAutoRange(false);domainAxis.setTickUnit(new DateTickUnit(DateTickUnit.SECOND,tickUnit_second_Count, new SimpleDateFormat("mm:ss")));plot.setDomainAxis(domainAxis);// 1. 设置Y轴特性NumberAxis vValueAxis = (NumberAxis) plot.getRangeAxis();vValueAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));vValueAxis.setAutoTickUnitSelection(false);NumberTickUnit nt = new NumberTickUnit(0.2d); // 设置刻度vValueAxis.setTickUnit(nt);vValueAxis.setUpperBound(1); // 设置Y轴最大值vValueAxis.setLowerBound(0); // 设置Y轴最小值}// 初始化图表的相关配置public void setGraphNameAndInit(String name) {chart.setTitle(name);// 1. 设置Y轴特性NumberAxis vValueAxis = (NumberAxis) plot.getRangeAxis();vValueAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));vValueAxis.setAutoTickUnitSelection(false);double maxValue = Runtime.getRuntime().totalMemory();double minValue = 32;NumberTickUnit nt = new NumberTickUnit((maxValue - minValue) / 10.0); // 设置刻度vValueAxis.setTickUnit(nt);// 1. 设置Y轴特性vValueAxis = (NumberAxis) plot.getRangeAxis();vValueAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 10));vValueAxis.setAutoTickUnitSelection(false);vValueAxis.setUpperBound(maxValue); // 设置Y轴最大值// vValueAxis.setLowerBound(minValue); // 设置Y轴最小值// 2. 设置曲线颜色XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();renderer.setSeriesShapesVisible(0, true);renderer.setSeriesPaint(0, Color.BLUE);renderer.setSeriesShape(0,new Ellipse2D.Float(-3.0f, -3.0f, 6.0f, 6.0f)); // circleplot.setRenderer(renderer);// 3. 设置点击出现数据点值的提示信息plot.setDomainCrosshairVisible(true);plot.setRangeCrosshairVisible(true);plot.getRenderer().setSeriesToolTipGenerator(0,new StandardXYToolTipGenerator("({1}, {2})",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),new DecimalFormat("#,##0.00")));chartPanel.validate();}public void showingSeries(Timestamp ts, String pvType, String fieldName,long fieldValue) {GregorianCalendar gc = DateUtil.getGregorianCalendarFrameTimestap(ts);int year = gc.get(Calendar.YEAR);int month = gc.get(Calendar.MONTH);int day = gc.get(Calendar.DATE);int hour = gc.get(Calendar.HOUR_OF_DAY);int miniute = gc.get(Calendar.MINUTE);int second = gc.get(Calendar.SECOND);final Hour h = new Hour(hour, new Day(day, month + 1, year));series.addOrUpdate(new Second(second, new Minute(miniute, h)),fieldValue);DateAxis domainAxis = (DateAxis) plot.getDomainAxis();// 设置X轴最大值gc = new java.util.GregorianCalendar(year, month, day, hour, miniute,second + 10);domainAxis.setMaximumDate(new Date(gc.getTimeInMillis()));// 设置X轴最小值, 最大值和最小值之间的距离为minutes_interval_of_X_axis分钟gc.add(Calendar.SECOND, -seconds_interval_of_X_axis);domainAxis.setMinimumDate(new Date(gc.getTimeInMillis()));}public static void main(String[] args) {JFrame f = new JFrame();MyMemoryChart chart = new MyMemoryChart();chart.setGraphNameAndInit("Memory");(chart.new DataGenerator(1000)).start();f.add(chart);f.setSize(400, 500);f.setVisible(true);//for (int i = 0; i < 100; i++) {//GregorianCalendar gc = new GregorianCalendar();//Timestamp ts = DateUtil.getTimestampFromGregorianCalendar(gc);//chart.showingSeries(ts, "", "", getFreeMemory());//}}class DataGenerator extends Timer implements ActionListener {public void actionPerformed(ActionEvent actionevent) {GregorianCalendar gc = new GregorianCalendar();Timestamp ts = DateUtil.getTimestampFromGregorianCalendar(gc);long l = Runtime.getRuntime().freeMemory();long l1 = Runtime.getRuntime().totalMemory();long value = getFreeMemory();System.out.println("Value:"+value);showingSeries(ts, "", "", value);}DataGenerator(int i) {super(i, null);addActionListener(this);}}private static long getFreeMemory() {return Runtime.getRuntime().freeMemory();}}1 楼 houxinbin 2012-05-08 DateUtil.getTimestampFromGregorianCalendar(gc);
DataUtil这个类没有