import java.awt.GridLayout;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.io.IOException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import javax.management.MBeanServerConnection;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

public class HeapUsageIndicator extends JPanel {
 
    private JLabel usedValue;
    private MemoryMXBean memorymxbean;
 
    public HeapUsageIndicator() {
        JPanel panel = new JPanel();
  
        JLabel label = new JLabel("Heap Used (byte)");
        panel.add(label);
        usedValue = new JLabel("0");
        panel.add(usedValue);
  
        add(panel);
    }
 
    public void setMBeanServerConnection(MBeanServerConnection connection) {
        try {
            memorymxbean = ManagementFactory.newPlatformMXBeanProxy(
                    connection,
                    ManagementFactory.MEMORY_MXBEAN_NAME,
                    MemoryMXBean.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class Worker extends SwingWorker<MemoryUsage,Object> {
        @Override
        public MemoryUsage doInBackground() {
            return memorymxbean.getHeapMemoryUsage();
        }
                                                                                
        @Override
        protected void done() {
            try {
                // doInBackgroundで取得したMemoryUsageを取得
                MemoryUsage usage = get();

                usedValue.setText(String.format("%d", usage.getUsed()));
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            } catch (ExecutionException ex) {
                ex.printStackTrace();
            }
        }
    }

    public SwingWorker<?,?> newSwingWorker() {
        return new Worker();
    }
}

