package skrueger.swing; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Locale; import java.util.Timer; import java.util.TimerTask; import javax.swing.JProgressBar; import org.apache.log4j.Logger; import schmitzm.lang.LangUtil; import schmitzm.lang.ResourceProvider; import schmitzm.swing.SwingUtil; import skrueger.swing.formatter.MbDecimalFormatter; public class HeapBar extends JProgressBar { private static final Logger LOGGER = Logger.getLogger(HeapBar.class); protected static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil .extendPackagePath(SwingUtil.class, "resource.locales.SwingResourceBundle"), Locale.ENGLISH); private Timer updateTimer; String valueAsText = ""; MbDecimalFormatter formatter = new MbDecimalFormatter(); public HeapBar() { updateTimer = new Timer("check memory"); updateTimer.scheduleAtFixedRate(new UpdateMemoryBarTask(), 1000, 5000); setMinimum(0); setMaximum(100); SwingUtil.setPreferredWidth(this, 200); // Clicking the bar triggers a GC addMouseListener( new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { LangUtil.gcTotal(); } }); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.black); g.drawString(valueAsText, 5, 12); } class UpdateMemoryBarTask extends TimerTask { @Override public void run() { // Get current size of heap in bytes long heapSize = Runtime.getRuntime().totalMemory(); // Get maximum size of heap in bytes. The heap cannot grow beyond // this size. // Any attempt will result in an OutOfMemoryException. long heapMaxSize = Runtime.getRuntime().maxMemory(); // Get amount of free memory within the heap in bytes. This size // will increase // after garbage collection and decrease as new objects are created. long heapFreeSize = Runtime.getRuntime().freeMemory(); long used = (heapSize - heapFreeSize); int percentaUsed = (int) (used * 100 / heapMaxSize); if (percentaUsed > 80) LOGGER.warn(percentaUsed + "% belegt"); if (percentaUsed > 70) { if (percentaUsed > 90) setForeground(Color.red); else setForeground(Color.orange); } else { setForeground(Color.green); } setValue(percentaUsed); valueAsText = RESOURCE.getString("HeapMemoryBar.status", formatter .format(used), percentaUsed, formatter.format(heapMaxSize)); repaint(); } } }