我有一个小的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);
代码结束
答案 0 :(得分:2)
你应该只考虑完整gc后的大小。我建议你先做一个System.gc()。
我希望像这样添加一个简单的对象来使用大约28个字节。 ArrayList中引用的4个字节,testheap
对象本身的24个字节(16字节头,4个字节用于引用,4个字节用于填充)
String不会在第一个之后使用任何空格,因为它每次都会使用相同的对象。
如果您关心内存使用并且知道所需列表的大小,请从一开始就使用该大小。
List<TestHeap> regList = new ArrayList<TestHeap>(2500000);