/*
 * Created on 15.08.2004
 */
package basics.profiler;

import basics.math.BasicStatistics;
import basics.utl.FormatterUtl;

/**
 * @author kst
 */
public class MemoryInfo
{
// private static Logger logger = Logger.getLogger(MemInfo.class);
final static Runtime RUNTIME   = Runtime.getRuntime();
long                 inittotal = 0;
long                 initused  = 0;
long                 lastdelta = 0;
BasicStatistics      stats     = null;

public MemoryInfo()
{
   stats = new BasicStatistics();
   inittotal = RUNTIME.totalMemory();
   initused = inittotal - RUNTIME.freeMemory();
   lastdelta = initused;
}

public static void gc()
{
   try
   {
      RUNTIME.wait(2);
   }
   catch(Exception e)
   {
   }
   RUNTIME.gc();
   try
   {
      RUNTIME.wait(2);
   }
   catch(Exception e)
   {
   }
}

public long getInitTotal()
{
   return inittotal;
}

public long getInitUsed()
{
   return initused;
}

public static long getUsedByte()
{
   Runtime r = Runtime.getRuntime();
   return r.totalMemory() - r.freeMemory();
}

public long getCurrentTotal()
{
   return RUNTIME.totalMemory();
}

public long getCurrentUsed()
{
   return getCurrentTotal() - RUNTIME.freeMemory();
}

public long getCurrentKBUsed()
{
   return (getCurrentTotal() - RUNTIME.freeMemory()) / (1024);
}

public String toString()
{
   long total = RUNTIME.totalMemory();
   long curUsed = getCurrentUsed();
   long cu = curUsed;// / 1024;
   long iu = initused;// / 1024;
   long free = RUNTIME.freeMemory();// / (1024);
   long diff = cu - iu;
   stats.add(cu);
   StringBuilder sb = new StringBuilder();
   sb.append(FormatterUtl.formatBytesPadLeft(iu, 0));
   if(diff != 0L)
   {
      sb.append("..");
      sb.append(FormatterUtl.formatBytesPadLeft(cu, 0));
      if(diff > 0)
      {
         sb.append(" +");
         sb.append(FormatterUtl.formatBytesPadLeft(diff, 0));
      }
      else
      {
         sb.append(" d");
         sb.append(FormatterUtl.formatBytesPadLeft((long)stats.getAverage(), 0));
      }
   }
   sb.append(" ^");
   sb.append(FormatterUtl.formatBytesPadLeft((long)stats.getMax(), 0));
   sb.append(", free ");
   sb.append(FormatterUtl.formatBytesPadLeft(free, 0));
   sb.append(" of ");
   sb.append(FormatterUtl.formatBytesPadLeft(total, 0));
   initused = curUsed;
   return sb.toString();
}
}
