2014-11-05 2 views
3

[] 길이 N.몇 바이트가 사용됩니까?

public class MysteryBox {  // 16B (object overhead) 
    private int N;    // 4B (int) 
    private boolean[] items; // 8B (reference to array) 
         // 24B (header of array) 
         // N (boolean array of size N) 
// 4B for padding 
// 17N (boolean objects, 16B of object metadata, 1B of data equivalent to 1 boolean) 
    ... 
} 

N의 함수로서 사용되는 바이트 수 (64 비트 메모리 비용 모델의 배열 항목에 입력 부울 의 N 항목을 저장 형 MysteryBox의 목적을 고려)? 내 대답이 맞습니까?

+1

귀하의 질문에 대한 직접적인 대답은 아니지만, 아마도'java.util.BitSet'은 이러한 종류의 정보를 저장하는 데 좋은 아이디어 일 수 있습니다. –

+0

'int'가 64 비트 시스템의 스택에서 64 비트가 아니어야합니까? 또한 클래스 메타 데이터를로드해야하며 클래스의 각 인스턴스는 스택 및 힙의 메모리를 사용합니다. – Hannes

+0

내가 기억하는 한, 불리언은 각 4 바이트에 저장됩니다. – njzk2

답변

0

실험적으로 알아 보겠습니다.

public static void main(String[] args) 
{ 
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); //This might cause a little bit of error 
    for(int N=1400;N<5000;N+=100) //this is on the stack, so it shouldn't affect us 
    { 
     int[] reserved = new int[1000]; //we'll clear this later 
     MysteryBox box = new MysteryBox(N); 
     int count = 1; 
     while(true) 
     { 
      try 
      { 
       MysteryBox temp = new MysteryBox(N); 
       temp.next = box; //don't worry, this extra variable was subtracted out during analysis 
       box=temp; 
       count++; 
      } 
      catch(java.lang.OutOfMemoryError e) 
      { 
       reserved = null; 
       MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage(); 
       long maxMemory = heapUsage.getMax(); 
       long usedMemory = heapUsage.getUsed(); 
       System.out.println(N+ " : " + count + " : Memory Use :" + usedMemory + "/" + maxMemory + ""); 
       break; 
      } 
     } 
    } 
} 

결과 : MysteryBox 당 메모리 사용 1.0052N + 33.84 주어진다 바이트 N. 메모리 사용에 대해 (1 내지 R^2 라운드) 매우 선형이다. 따라서 각 부울은 약 1 바이트를 차지하고 나머지 오버 헤드는 약 34 바이트로 맞춰집니다. 오버 헤드가 어떻게 분산되어 있는지 추측 해보도록하겠습니다.

관련 문제