ArrayList使用意外的堆大小

时间:2013-11-29 16:18:37

标签: java arraylist

我有一个小的java测试类,只有一个成员变量..而且该变量是一个String。我有一个ArrayList,我在其中添加了这个类的很多对象。我看到使用的堆大约是我添加到它的数据的6倍。有没有办法优化这个OR在这种情况下使用ArrayList是一个问题。

代码:

public class  testheap
{
String          regionId;   

testheap(String s) {  
    this.regionId = s;
}


public static void main(String[] args) throws Exception
{

    ArrayList<testheap> regList = new ArrayList<testheap>(10000);

    System.out.println("just Before looping");
    printHeapSizes();
    //looping
    int i = 0;
    while (i++ < 2500000)   {
        if (i%500000 == 0) printHeapSizes();  // print heap sizes every 500000th iteration
        testheap reg = new testheap("abcd");
        regList.add(reg);
    }
    System.out.println("end of loop");
    printHeapSizes();
 public static void printHeapSizes() {
 long heapSize = Runtime.getRuntime().totalMemory(); 

    // Get maximum size of heap in bytes. The heap cannot grow beyond this size.// Any attempt will result in an OutOfMemoryException.
    //long heapMaxSize = Runtime.getRuntime().maxMemory();

     // Get amount of free memory within the heap in bytes. This size will increase // after garbage collection and decrease as new objects are created.
    long heapFreeSize = Runtime.getRuntime().freeMemory(); 
    long usedSize = heapSize - heapFreeSize;
    System.out.println("total:"+heapSize+" Freesize:"+heapFreeSize + "      USED:"+usedSize);

代码结束

1 个答案:

答案 0 :(得分:2)

你应该只考虑完整gc后的大小。我建议你先做一个System.gc()。

我希望像这样添加一个简单的对象来使用大约28个字节。 ArrayList中引用的4个字节,testheap对象本身的24个字节(16字节头,4个字节用于引用,4个字节用于填充)

String不会在第一个之后使用任何空格,因为它每次都会使用相同的对象。

如果您关心内存使用并且知道所需列表的大小,请从一开始就使用该大小。

List<TestHeap> regList = new ArrayList<TestHeap>(2500000);