本文轉載自: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版