import java.awt.Container; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import java.text.DecimalFormat; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; import javax.swing.JLabel; public class MemoryMXBeanTest { private MemoryMXBean mbean; private JLabel heapLabel; private JLabel nonheapLabel; private MemoryUsageGraph heapGraph; private MemoryUsageGraph nonheapGraph; private DecimalFormat format; private final static String HEAP = " Heap "; private final static String NON_HEAP = " Non Heap "; private final static double TRANS_B_TO_M = 1024.0 * 1024.0; private final static double TRANS_B_TO_K = 1024.0; public MemoryMXBeanTest() { mbean = ManagementFactory.getMemoryMXBean(); MemoryUsage heapUsage = null; MemoryUsage nonHeapUsage = null; synchronized (mbean) { heapUsage = mbean.getHeapMemoryUsage(); nonHeapUsage = mbean.getNonHeapMemoryUsage(); } heapGraph = new MemoryUsageGraph(); heapGraph.setMemoryUsage(heapUsage); nonheapGraph = new MemoryUsageGraph(); nonheapGraph.setMemoryUsage(nonHeapUsage); format = new DecimalFormat("0.00"); initView(); Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { updateView(); } }, 0, 500L); } private void initView() { JFrame frame = new JFrame("Memory Infomation"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container = frame.getContentPane(); container.setLayout(new CompactGridLayout(0, 1)); heapLabel = new JLabel(HEAP); container.add(heapLabel); container.add(heapGraph); nonheapLabel = new JLabel(NON_HEAP); container.add(nonheapLabel); container.add(nonheapGraph); frame.pack(); frame.setVisible(true); } private void updateView() { MemoryUsage heapUsage = null; MemoryUsage nonHeapUsage = null; synchronized (mbean) { heapUsage = mbean.getHeapMemoryUsage(); nonHeapUsage = mbean.getNonHeapMemoryUsage(); } heapGraph.setMemoryUsage(heapUsage); heapLabel.setText(createLabelText(HEAP, heapUsage)); nonheapGraph.setMemoryUsage(nonHeapUsage); nonheapLabel.setText(createLabelText(NON_HEAP, nonHeapUsage)); } private String createLabelText(String pre, MemoryUsage usage) { StringBuilder builder = new StringBuilder(); builder.append(pre); builder.append("("); double max = usage.getMax(); if (max > 2000000L) { max /= TRANS_B_TO_M; builder.append(format.format(max)); builder.append("M, "); } else { max /= TRANS_B_TO_K; builder.append(format.format(max)); builder.append("K, "); } double committed = usage.getCommitted(); if (committed > 2000000L) { committed /= TRANS_B_TO_M; builder.append(format.format(committed)); builder.append("M): "); } else { committed /= TRANS_B_TO_K; builder.append(format.format(committed)); builder.append("K): "); } double used = usage.getUsed(); if (used > 2000000L) { used /= TRANS_B_TO_M; builder.append(format.format(used)); builder.append("M"); } else { used /= TRANS_B_TO_K; builder.append(format.format(used)); builder.append("K"); } return builder.toString(); } public static void main(String[] args) { new MemoryMXBeanTest(); } }