2013-04-17 84 views
4

是否有可能在java中以字节为单位获取Vector或ArrayList或任何对象的大小? size()函数只给出元素的数量。但是我想获得对象的实际大小。Java:向量的大小(以字节为单位)

+0

*“但我想获得对象的实际大小。”*为什么? –

+0

是可能的,只要你可以计算Vector/Array中单个对象的字节数 – Ankit

+1

通常你不需要知道这一点,但如果你真的要做的最简单的事情就是使用内存分析器。例如随JDK提供的免费VisualVM。 –

回答

0

目前,我实现了我自己的规模。

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

它不会像那样工作...每个字符串都有开销,列表本身有开销等。 – assylias

+0

这不是OP要求的。他说以字节为单位的大小,并没有提到一个字符串ArrayList,只是对象。 – Averroes

+0

@assylias:开销可能会影响列表的整体大小有多大?我假设上面的代码可以给我足够的估计对象的大小。 – rahul

0

不同的JDK具有不同大小的含义对象。

你可以通过隐含对象大小乘以向量或数组列表的长度来计算它。 例如,如果您声明一个整数的araylist,其中有10条记录,则 Java整数是32位,即32/8 = 4个字节。 您有10条记录,因此10x4 = 40个字节。

标准java字节= 8位,短= 16位,int = 32位,长= 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为新的String(),那么它工作正常,然后创建你的对象,并查看其大小

查看更多在这里http://www.javaspecialists.eu/archive/Issue029.html

相关问题