使用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)); // circle
plot.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();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值