内存管理
尽管Java提供了自动的垃圾回收,但是有时会希望了解对象堆有多大或剩余的对堆空间的大小。可以通过Runtime类的方法,获取内存大小,并对内存进行管理。
下面的例子将使用gc(), freeMemory(), totalMemory()三个方法
public class MemoryDemo {
public static void main(String[] args) {
Runtime r = Runtime.getRuntime();
long mem1, mem2;
Integer someints[] = new Integer[1000];
System.out.println("Total memory is: " + r.totalMemory());
mem1 = r.freeMemory();
System.out.println("Initial memory is: " + mem1);
r.gc();
mem1 = r.freeMemory();
System.out.println("Free memory after garbage collection: " + mem1);
for (int i = 0; i<1000; i++) {
someints[i] = new Integer(i);
}
mem2 = r.freeMemory();
System.out.println("Free memory after collection: " + mem2);
System.out.println("Memory used by allocation: " + (mem1 - mem2));
for (int i=0; i<1000; i++) {
someints[i] = null;
}
r.gc();
mem2 = r.freeMemory();
System.out.println("Free memory after collecting" + " discarded Integers: " + mem2);
}
}
输出结果
Total memory is: 257425408
Initial memory is: 253374984
Free memory after garbage collection: 256738712
Free memory after collection: 254054264
Memory used by allocation: 2684448
Free memory after collecting discarded Integers: 256814648
这里可以看到:Total memory is: 257425408 这里单位是bytes 。 257425408bytes = 245.5M
看图可以知道JVM运行时需要使用的内存是245.5M
Initial memory is: 253374984 也就是初始可用的内存是241.63721466064453M
再调用gc()释放内存之后
Free memory after garbage collection: 256738712, 可用内存变为 244.8451156616211M
当我们在数组someints里面创建Integer对象后
Free memory after collection: 254054264, 可用内存变为242.28502655029297M
把两个剩余可用内存相减可以得到,数组someints使用了多少内存
Memory used by allocation: 2684448, 使用内存2.560089111328125M
设置数组为空,释放内存
Free memory after collecting discarded Integers: 256814648, 可用内存为244.91753387451172M
我们这里改下代码 someints[i] = new Integer(i);
改为 someints[i] = i;
看下输出结果
Total memory is: 257425408
Initial memory is: 253374984
Free memory after garbage collection: 256738712
Free memory after collection: 254054264
Memory used by allocation: 2684448
Free memory after collecting discarded Integers: 256814648
可以看到用Integer还是直接赋值,使用的内存是一致的
Memory used by allocation: 2684448 使用内存为2.560089111328125M