查找Java中的操作所消耗的内存

时间:2012-08-29 11:21:07

标签: java memory-management

假设我在Java中执行类似以下的冒泡排序示例:

package testing;

public class bubbleSort {
public static void main(String a[]) {
    int i;
    int array[] = { 12, 9, 4, 99, 120, 1, 3, 10 };
    System.out.println("Values Before the sort:\n");
    for (i = 0; i < array.length; i++)
        System.out.print(array[i] + "  ");
    System.out.println();
    bubble_srt(array, array.length);
    System.out.print("Values after the sort:\n");
    for (i = 0; i < array.length; i++)
        System.out.print(array[i] + "  ");
    System.out.println();
    System.out.println("PAUSE");
}

public static void bubble_srt(int a[], int n) {
    int i, j, t = 0;
    for (i = 0; i < n; i++) {
        for (j = 1; j < (n - i); j++) {
            if (a[j - 1] > a[j]) {
                t = a[j - 1];
                a[j - 1] = a[j];
                a[j] = t;
            }
        }
    }
}
}

有没有办法找出

(a)元素数组的数据结构消耗多少RAM?

(b)如果没有 - 有没有办法比较进程消耗的RAM与香草HelloWorld相比多少?

package testing;

public class Testing {
public static void main(String[] args) {
    System.out.println("Hello World!");
}

}

4 个答案:

答案 0 :(得分:1)

  

元素数组的数据结构消耗了多少RAM?

不容易。它将长约40-48字节,这不值得担心。

  

如果没有 - 有没有办法比较进程消耗的RAM与香草HelloWorld相比多少?

猜测一下,我会说你的第一个例子比第二个例子使用多达100 KB。这是因为在意义之后继续分配加载额外的类并将int值转换为String这是大部分内存消耗。相比之下,你的阵列是微不足道的。

无论如何,100 KB也不值得担心。在桌面上,100 KB的成本不到1美分,并且可以重复使用。

答案 1 :(得分:1)

您可以使用getRunTime()查找当前程序的运行时。 totalmemory属性将帮助您找到使用的内存。

   // Get the Java runtime
    Runtime runtime = Runtime.getRuntime();
    // Run the garbage collector
    runtime.gc();
    // Calculate the used memory
    long memory = runtime.totalMemory() - runtime.freeMemory();

答案 2 :(得分:0)

您必须对应用程序进行概要分析才能获得真正的内存使用情况。试试YourKit。在调用sort之前向应用程序添加暂停。在运行排序之前和完成之后创建内存快照并进行比较。

调用所有GC不会带给你“真实”的结果。 VM本身分配了很多对象。将被清理,你会得到错误的图片。

答案 3 :(得分:0)

使用此公式;

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

     static final Runtime runtime = Runtime.getRuntime();