代码一 

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版