зеркало из https://github.com/mozilla/pjs.git
112 строки
2.9 KiB
Java
112 строки
2.9 KiB
Java
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil -*-
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License
|
|
* Version 1.0 (the "License"); you may not use this file except in
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS"
|
|
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
|
* the License for the specific language governing rights and limitations
|
|
* under the License.
|
|
*
|
|
* The Original Code is the Grendel mail/news client.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
|
* Corporation. Portions created by Netscape are Copyright (C) 1997
|
|
* Netscape Communications Corporation. All Rights Reserved.
|
|
*/
|
|
|
|
package calypso.util;
|
|
|
|
import java.lang.Runtime;
|
|
|
|
/**
|
|
* A utility class to help track memory usage during development.
|
|
* The interface is simple. Just create the monitor, do your business,
|
|
* and then invoke the done method. <p>
|
|
*
|
|
* The figure for the ammount of memory allocated should be accurate
|
|
* but the number for the ammount of garbage can be off by quite a bit
|
|
* if any garbage collection was done between the monitor's creation
|
|
* and the call to done. <p>
|
|
*
|
|
* Currently, it just prints some stuff to the console. I'd like to
|
|
* extend it so it creates a window and displays it's info in that.
|
|
*
|
|
* @author Thom FillABomb :-)
|
|
*/
|
|
public class MemoryMonitor
|
|
{
|
|
Runtime fSystem;
|
|
|
|
long fFreeAtStart,
|
|
fFreeAtEnd,
|
|
fGarbageGenerated;
|
|
|
|
String fUserString = null;
|
|
|
|
public MemoryMonitor (String monitorDescription)
|
|
{
|
|
fUserString = monitorDescription;
|
|
initialize();
|
|
}
|
|
|
|
public MemoryMonitor ()
|
|
{
|
|
initialize();
|
|
}
|
|
|
|
protected void initialize ()
|
|
{
|
|
fSystem = Runtime.getRuntime();
|
|
beginMonitor();
|
|
}
|
|
|
|
public void done ()
|
|
{
|
|
finishMonitor ();
|
|
|
|
System.out.println();
|
|
|
|
if (fUserString != null)
|
|
System.out.println (fUserString);
|
|
|
|
System.out.println (" Starting Free: " + fFreeAtStart);
|
|
System.out.println (" Ending Free: " + fFreeAtEnd);
|
|
System.out.println (" Memory Delta: " + (fFreeAtStart - fFreeAtEnd));
|
|
System.out.println ("Garbage Generated: " + fGarbageGenerated);
|
|
}
|
|
|
|
protected void freeUpMemory ()
|
|
{
|
|
// we might want to tickle Kipp's memory Manager here as well...
|
|
|
|
fSystem.runFinalization();
|
|
// might want to sleep here
|
|
fSystem.gc();
|
|
fSystem.gc();
|
|
}
|
|
|
|
void beginMonitor ()
|
|
{
|
|
freeUpMemory();
|
|
fFreeAtStart = fSystem.freeMemory();
|
|
}
|
|
|
|
void finishMonitor ()
|
|
{
|
|
long totalUsed, minusGarbage;
|
|
|
|
totalUsed = fSystem.freeMemory();
|
|
freeUpMemory();
|
|
minusGarbage = fSystem.freeMemory();
|
|
|
|
// it would also be interesting to purge the recyclers here and
|
|
// see how much memory they're occupying
|
|
|
|
fGarbageGenerated = minusGarbage - totalUsed;
|
|
fFreeAtEnd = minusGarbage;
|
|
}
|
|
}
|