1

我写了一个java程序,我想看看它什么时候运行它使用了多少内存。有什么方法可以查看与我的程序相关的 RAM 使用量吗?我的意思是可以通过在调用主代码之前和之后编写此代码来查看程序的时间使用情况:

long startTime = System.currentTimeMillis();
new Main();
long endTime = System.currentTimeMillis();
System.out.println("Total Time: " + (endTime - startTime));
4

4 回答 4

1

您可以使用以下类。实现 Instantiator 接口,您可以多次执行相同的进程来获得内存消耗的精确视图

public class SizeOfUtil {

    private static final Runtime runtime = Runtime.getRuntime();
    private static final int OBJECT_COUNT = 100000;

    /**
     * Return the size of an object instantiated using the instantiator
     * 
     * @param instantiator
     * @return byte size of the instantiate object
     */      
    static public int execute(Instantiator instantiator) {
        runGarbageCollection();
        usedMemory();
        Object[] objects = new Object[OBJECT_COUNT + 1];
        long heapSize = 0;
        for (int i = 0; i < OBJECT_COUNT + 1; ++i) {
            Object object = instantiator.execute();
            if (i > 0)
                objects[i] = object;
            else {
                object = null;
                runGarbageCollection();
                heapSize = usedMemory();
            }
        }
        runGarbageCollection();
        long heap2 = usedMemory(); // Take an after heap snapshot:
        final int size = Math.round(((float) (heap2 - heapSize)) / OBJECT_COUNT);

        for (int i = 1; i < OBJECT_COUNT + 1; ++i)
            objects[i] = null;
        objects = null;
        return size;
    }

    private static void runGarbageCollection() {
        for (int r = 0; r < 4; ++r){
            long usedMem1 = usedMemory();
            long usedMem2 = Long.MAX_VALUE;
            for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {
                runtime.runFinalization();
                runtime.gc();
                Thread.yield();
                usedMem2 = usedMem1;
                usedMem1 = usedMemory();
            }
        }
    }

    private static long usedMemory() {
        return runtime.totalMemory() - runtime.freeMemory();
    }
}

实现接口

公共接口实例化器{对象执行();}

使用您要测试的代码

public void sizeOfInteger(){
    int size = SizeOfUtil.execute(new Instantiator(){
        @Override public Object execute() {
            return new Integer (3);
        }
    });
    System.out.println(Integer.class.getSimpleName() + " size = " + size + " bytes");
}

来源:Java 教程 Java 对象的大小

于 2013-04-12T09:37:23.850 回答
0

我认为这一定有帮助: visualvm

它带有 jdk,并且有许多有助于控制内存使用的东西

于 2013-04-12T09:09:08.950 回答
0

通过比较加载程序前后 JVM 的可用内存,您可以获得非常接近的值。差异非常接近程序的内存使用量。获取 JVM 可用内存使用

Runtime.getRuntime().freeMemory()

要获取内存使用情况,请执行以下操作:

public static void main (String args[]){
  long initial = Runtime.getRuntime().freeMemory(); //this must be the first line of code executed
  //run your program ... load gui etc
  long memoryUsage = Runtime.getRuntime().freeMemory() -  initial ;

}
于 2013-04-12T09:09:18.720 回答
0

java-application-memory-usage 使用
选项 启动您的应用程序,-Dcom.sun.management.jmxremote例如

java -Dcom.sun.management.jmxremote -jar myapp.jar

或者您可以尝试:

jvisualvm.exe 你可以在 jdk/bin 目录下找到它。

看看以下可能会有所帮助:

  1. 如何在我的 jvm 或 Eclipse 中监控多少线程和内存使用情况
  2. Java进程的内存使用情况
于 2013-04-12T09:10:18.647 回答