本文转载自:http://blog.163.com/jackswu@yeah/blog/static/1406291232010112343040616/
代码一
Java代码
List list = new ArrayList();
代码二
Java代码
List list = null;
如果有10000个类似于list的对象,代码一比代码二会多占多少内存?
/**
*
*/
package TestPack;
import java.util.ArrayList;
import java.util.List;
/**
* @author Jack.
* @Time:下午 04:14:38.
* @FileName:TestNullAndNew.java.
*/
public class TestNullAndNew
{
/**
* @param args
* .
*/
@SuppressWarnings({ "rawtypes", "unused" })
public static void main(String[] args)
{
long freeMemory = Runtime.getRuntime().freeMemory();
System.out.println("系统空余内存(KB) : " + freeMemory);
System.out.println("系统总内存(KB) : " + Runtime.getRuntime().totalMemory());
for (int i = 0; i < 10000; i++)
{
List list = new ArrayList();
}
long freeMemoryNew = Runtime.getRuntime().freeMemory();
System.out.println("使用new之前的空余内存(KB):" + freeMemory);
System.out.println("使用new之后的空余内存(KB) : " + freeMemoryNew
+ "\nnew的内存使用(KB) : " + (freeMemory - freeMemoryNew));
for (int i = 0; i < 10000; i++)
{
List list = null;
}
long freeMemoryNull = Runtime.getRuntime().freeMemory();
System.out.println("使用null之前的空余内存(KB):" + freeMemoryNew);
System.out.println("使用null之后的空余内存(KB): " + freeMemoryNull
+ "\nnull的内存使用(KB) : " + (freeMemoryNew - freeMemoryNull));
System.out.println("totalMemory(KB) : "
+ Runtime.getRuntime().totalMemory());
}
}
运行结果:
系统空余内存(KB) : 15940336
系统总内存(KB) : 16252928
使用new之前的空余内存(KB):15940336
使用new之后的空余内存(KB) : 15216704
new的内存使用(KB) : 723632
使用null之前的空余内存(KB):15216704
使用null之后的空余内存(KB): 15216704
null的内存使用(KB) : 0
totalMemory(KB) : 16252928
结论:
List list = null; 不会占用内存。
代码1执行10000次占用24.944M内存。
具体执行结果可能跟操作系统与主机配置和JDK版本有关,稍有偏差。
我们应该尽量避免创建对象,可以考虑使用单例模式。关于JAVA性能方面推荐《Effective Java》中文版 第2版