package jeffaschenk.commons.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.text.NumberFormat; /** * Provides Simple memory Usage Object for calculating during of task or other * invocations. * * @author jeffaschenk@gmail.com * @version $Id: $ */ public class MemoryUsage { /** * Logging */ private static Log log = LogFactory.getLog(MemoryUsage.class); /** * Time Duration */ private TimeDuration timeDuration = new TimeDuration(); /** * Memory Constants */ private static final String[] sizenames = new String[]{"B", "KB", "MB", "GB", "TB", "PB"}; /** * Start Memory in Bytes */ private double start = 0; /** * End Memory in Bytes */ private double end = 0; /** * Start Free Memory in Bytes */ private double start_free = 0; /** * End Free Memory in Bytes */ private double end_free = 0; /** * Provides Default Constructor. */ public MemoryUsage() { } // End of Constructor. /** * <p>getCurrentMemory</p> * * @return {@link String} object. */ public String getCurrentMemory() { double current_memory = Runtime.getRuntime().totalMemory(); double current_free_memory = Runtime.getRuntime().freeMemory(); return "JVM Total Memory:[" + getMemoryBytesToString(current_memory) + "], Free Memory:[" + getMemoryBytesToString(current_free_memory) + "]"; } /** * Set Current Time as Start Time. */ public void start() { timeDuration.start(); start = Runtime.getRuntime().totalMemory(); start_free = Runtime.getRuntime().freeMemory(); end = start; end_free = start_free; } // End of start Method. /** * Set Current Time as End Time. */ public void stop() { timeDuration.stop(); end = Runtime.getRuntime().totalMemory(); end_free = Runtime.getRuntime().freeMemory(); } // End of stop Method. /** * Reset all Counters. */ public void reset() { start = 0; end = 0; start_free = 0; end_free = 0; timeDuration.reset(); } // End of Reset Method. /** * Get current Duration. * * @return double. */ public double getCurrentMemoryDifference() { timeDuration.stop(); stop(); return (end - start); } // End of getCurrentDuration Method. /** * Obtain data in String form. * * @return String representation of Memory Usage. */ public String toString() { timeDuration.stop(); stop(); return "Duration:[" + timeDuration.toString() + "], JVM Start Total Memory:[" + getMemoryBytesToString(start) + "], Start Free Memory:[" + getMemoryBytesToString(start_free) + "], " + "Current Total Memory:[" + getMemoryBytesToString(end) + "], Current Free Memory:[" + getMemoryBytesToString(end_free) + "], " + "Difference Total Memory:[" + getMemoryBytesToString(end - start) + "]" + getMemoryMovement(end - start) + ", Difference Free Memory:[" + getMemoryBytesToString(end_free - start_free) + "]" + getMemoryMovement(end_free - start_free); } // End of toString Override method. /** * Log the Memory Consumption */ public void toLog() { timeDuration.stop(); stop(); if (log.isInfoEnabled()) { log.info( "Duration:[" + timeDuration.toString() + "], JVM Start Total Memory:[" + getMemoryBytesToString(start) + "], Start Free Memory:[" + getMemoryBytesToString(start_free) + "]"); log.info( "JVM Current Total Memory:[" + getMemoryBytesToString(end) + "], Current Free Memory:[" + getMemoryBytesToString(end_free) + "]"); log.info( "JVM Difference Total Memory:[" + getMemoryBytesToString(end - start) + "]" + getMemoryMovement(end - start) + ", Difference Free Memory:[" + getMemoryBytesToString(end_free - start_free) + "]" + getMemoryMovement(end_free - start_free)); } } // End of toLog Override method. /** * Get Memory Usage in String Form. * * @param _memory double primitive. * @return String of Memory. */ public String getMemoryBytesToString(final double _memory) { // ************************************ // Set Decimal precision up to 2 digits NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); nf.setMinimumFractionDigits(2); // ************************************ // Check for Negative Value double bytes = _memory; if (bytes < 0) { bytes = bytes * -1; } // ************************************ // Loop to scale number to nearest // xByte Level. for (int i = 0; i < sizenames.length; i++) { if ((bytes < 1024)) { return nf.format(bytes).toString() + sizenames[i]; } bytes = bytes / 1024; } // End of For Loop. // *********************************** // Show Bytes, if all else fails. return _memory + sizenames[0]; } // End of getMemoryBytesToString Helper Method. /** * Show Memory Movement * * @return String */ private String getMemoryMovement(double _memory) { if ((_memory) == 0) { return "Same"; } else if ((_memory < 0)) { return "Decrease"; } else { return "Increase"; } } /** * Main * Test Memory conversions. * * @param argsv an array of {@link String} objects. */ public static void main(String argsv[]) { MemoryUsage mu = new MemoryUsage(); mu.start(); System.out.println(mu.getMemoryBytesToString(0)); System.out.println(mu.getMemoryBytesToString(-128)); System.out.println(mu.getMemoryBytesToString(700)); System.out.println(mu.getMemoryBytesToString(1024)); System.out.println(mu.getMemoryBytesToString(2000)); System.out.println(mu.getMemoryBytesToString(1024 * 2)); System.out.println(mu.getMemoryBytesToString(1024 * 3)); System.out.println(mu.getMemoryBytesToString(5000)); System.out.println(mu.getMemoryBytesToString(1024 * 100)); System.out.println(mu.getMemoryBytesToString(1024 * 1000)); System.out.println(" "); System.out.println(mu.getMemoryBytesToString(1024 * 1024)); System.out.println(mu.getMemoryBytesToString(1024 * 1024 * 1024)); System.out.println(mu.getMemoryBytesToString(Math.pow(1024, 4))); System.out.println(mu.getMemoryBytesToString(Math.pow(1024, 5))); System.out.println(mu.getMemoryBytesToString(Math.pow(1024, 5) * 2)); System.out.println(mu.getMemoryBytesToString(Math.pow(1024, 6) * 2)); System.out.println(mu.toString()); Runtime.getRuntime().gc(); System.out.println("After GC: \n"); System.out.println(mu.toString()); } // End of Main. } // /:>~ End of MemoryUsage Class.