如何通过Java的Runtime api获取我的Java程序使用的内存?

32 浏览
0 Comments

如何通过Java的Runtime api获取我的Java程序使用的内存?

有类似的问题,但它们似乎回避了回答这个具体的问题。我如何通过Java的Runtime API获取我的Java程序使用的内存?

这里的答案指出我可以这样做:

System.out.println("KB: " + (double)(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);

但无论运行哪个程序,这总是返回相同的数字。例如,在下面的程序中,无论我在地图中放入多少个数字,内存使用量都保持不变。

package memoryTest;
import java.util.HashMap;
import java.util.Map;
public class MemoryTest {
    static Map map = new HashMap();
    public static void main(String[] args){
        System.out.println("KB: " + (double)(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
        fillMemory(25);
        System.out.println("KB: " + (double)(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
    }
    static int j=0;
    public static void fillMemory(int i){
        for(int k=0; k< 2000; k++)
            map.put(j++, new NewObject());
    }
    public static class NewObject{
        long i = 0L;
        long j = 0L;
        long k = 0L;
    }
}

通过cambecc的main方法,输出如下:

# 3085, 总共: 128516096, 空闲: 127173744, 差异: 671120
# 173579, 总共: 128516096, 空闲: 110033976, 差异: 671128
# 335207, 总共: 128516096, 空闲: 92417792, 差异: 637544
# 672788, 总共: 224198656, 空闲: 159302960, 差异: 1221520
# 1171480, 总共: 224198656, 空闲: 106939136, 差异: 1221544
# 1489771, 总共: 368377856, 空闲: 227374816, 差异: 1212984
# 1998743, 总共: 368377856, 空闲: 182494408, 差异: 1212984

0