2013-04-17 3 views
4

Возможно ли получить размер Vector или ArrayList или любого объекта в этом случае в байтах в java? size() дает только количество элементов. Но я хочу получить фактический размер объекта.Java: размер вектора в байтах

+0

* «Но я хочу получить фактический размер объекта». * Почему? –

+0

Да, это возможно, если вы можете рассчитать байты отдельного объекта в этом векторе/массиве. – Ankit

+1

Как правило, вам не нужно это знать, но если вы действительно делаете простейший шаг, это использовать профайлер памяти. например бесплатный VisualVM, который поставляется вместе с JDK. –

ответ

0

На данный момент я реализовал свои собственные для получения размера.

long sizeof(ArrayList<String> list) 
{ 
    long size = 0; 
    for(String s: list) 
     size+=s.length(); 
    return size; 
} 
+0

Это не работает так ... Каждая строка имеет накладные расходы, сам список имеет накладные расходы и т. Д. – assylias

+0

Это не то, о чем спрашивает ОП. Он сказал размер в байтах и ​​не упоминал String ArrayList, просто объекты. – Averroes

+0

@assylias: Насколько велика эта накладная может повлиять на общий размер списка? Я предполагаю, что приведенный выше код мог бы дать мне достаточно хорошую оценку размера объекта. – rahul

0

Различные JDK, имеющие разный размер для объектов имплицита.

Вы можете посчитать его размером объекта implicite умножить длину вектора или arraylist. Например, если вы объявляете araylist целого числа с 10 записями в нем, то Целочисленные числа Java составляют 32 бита, то есть 32/8 = 4 байта. У вас есть 10 записей, поэтому 10x4 = 40 байт.

в стандартном java-байте = 8 бит, short = 16бит, int = 32бит, long = 64 бит.

0

Первое: попробуйте прочитать Does Java have an operator like "sizeof()" in C

Второе: Try this code:

public class Sizeof 
{ 
    public static void main (String [] args) throws Exception 
    { 
     // Warm up all classes/methods we will use 
     runGC(); 
     usedMemory(); 
     // Array to keep strong references to allocated objects 
     final int count = 100000; 
     Object [] objects = new Object [count]; 

     long heap1 = 0; 
     // Allocate count+1 objects, discard the first one 
     for (int i = -1; i < count; ++ i) 
     { 
      Object object = null; 

      // Instantiate your data here and assign it to object 

      object = new Object(); 
      //object = new Integer (i); 
      //object = new Long (i); 
      //object = new String(); 
      //object = new byte [128][3] 

      if (i >= 0) 
       objects [i] = object; 
      else 
      { 
       object = null; // Discard the warm up object 
       runGC(); 
       heap1 = usedMemory(); // Take a before heap snapshot 
      } 
     } 
     runGC(); 
     long heap2 = usedMemory(); // Take an after heap snapshot: 

     final int size = Math.round (((float)(heap2 - heap1))/count); 
     System.out.println ("'before' heap: " + heap1 + 
          ", 'after' heap: " + heap2); 
     System.out.println ("heap delta: " + (heap2 - heap1) + 
      ", {" + objects [0].getClass() + "} size = " + size + " bytes"); 
     for (int i = 0; i < count; ++ i) objects [i] = null; 
     objects = null; 
    } 
    private static void runGC() throws Exception 
    { 
     // It helps to call Runtime.gc() 
     // using several method calls: 
     for (int r = 0; r < 4; ++ r) _runGC(); 
    } 
    private static void _runGC() throws Exception 
    { 
     long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE; 
     for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++ i) 
     { 
      s_runtime.runFinalization(); 
      s_runtime.gc(); 
      Thread.currentThread().yield(); 

      usedMem2 = usedMem1; 
      usedMem1 = usedMemory(); 
     } 
    } 
    private static long usedMemory() 
    { 
     return s_runtime.totalMemory() - s_runtime.freeMemory(); 
    } 

    private static final Runtime s_runtime = Runtime.getRuntime(); 
} // End of class 
0

Это должно показать Использование памяти

Runtime rt = Runtime.getRuntime(); 
long m0 = rt.totalMemory() - rt.freeMemory(); 
Object obj = new Object();  // create your object here 
long m1 = rt.totalMemory() - rt.freeMemory(); 
System.out.println(m1 - m0); 

, но он не работает. Это работает (по крайней мере, на моем компьютере)

public static void main(String[] args) throws Exception { 
    Object obj = createObject(); 
    long m0 = usedMem(); 
    long m1 = usedMem(); 
    obj = null; 
    for (int i = 0; i < 100; i++) 
     System.gc(); 
    m0 = usedMem(); 
    obj = createObject(); 
    for (int i = 0; i < 100; i++) 
     System.gc(); 
    m1 = usedMem(); 
    System.out.println(m1 - m0); 
} 

private static long usedMem() { 
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 
} 

private static Object createObject() { 
    return new Object(); 
} 

если он печатает 8 для нового объекта и 40 для новой строки(), то она работает правильно, а затем создать свой объект и увидеть его размер

Подробнее здесь http://www.javaspecialists.eu/archive/Issue029.html

Смежные вопросы