2012-06-28 36 views
2

可能重复:
In Java, what is the best way to determine the size of an object?计算物体的“权重”了,如何

假设你有一个数据结构,它允许您将数据添加到它,说一个列表:

List<KeyValuePair> 

由于系统的客户端实际上添加了内容...在某些时候,JVM将耗尽内存,它只是aq这是什么时候发生的。定期将包含此列表的对象保存到磁盘并将剩余的部分保存到gc会更好。

使用Java,是否有可能估计一个对象正在使用多少内存?

+1

你真的想估计对象的大小吗?看起来正确的问题是“因为我有一个巨大的对象,如何知道何时该写入磁盘并丢弃它?” – templatetypedef

+1

够公平的,但我确实需要知道“巨大的手段”,对吧? – JAM

+0

重复:http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –

回答

3

您正在寻找java.lang.instrument.Instrumentation.getObjectSize(Object object)

文档:

返回由指定对象使用的 存储量的具体实现的近似。结果可能包括一些 或所有对象的开销,因此在实现中对比较 是有用的,但在实现之间不起作用。估计 可能会在JVM的单个调用期间发生更改。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29

但是为了能够使用它:

只有这样,才能访问仪表接口的实例是 用于以一种方式来推出的JVM是表示代理类别 - 请参阅包装规格。 Instrumentation实例通过 传递给代理类的premain方法。代理程序获取 工具实例后,代理程序可随时调用实例 上的方法。

良好的执行样本: http://www.javalobby.org/java/forums/t19309.html

+0

你能提供一个例子吗? – JAM

+0

我需要此功能时遵循本教程:http://www.javalobby.org/java/forums/t19309.html –

3

getObjectSize()方法可能是你要找的。从Interface Instrumentation文档
引用:

getObjectSize(对象objectToSize)
返回由指定的对象所消耗的存储量的一个具体实现的近似。

1

您可以通过很多相同的对象和测量所采取的内存做。我已经多次使用这种技术,并获得了稳定,可重复的结果。总的来说,

public static void main(String[] args) { 
    final Object[] a = new Object[10000]; 
    final long startMem = memTaken(); 
    for (int i = 0; i < a.length; i++) a[i] = new Object(); 
    System.out.println((memTaken() - startMem)/a.length); 
    a.hashCode(); 
} 
static long memTaken() { 
    final Runtime rt = getRuntime(); 
    try { 
    rt.gc(); Thread.sleep(50); 
    rt.gc(); Thread.sleep(50); 
    } catch (InterruptedException e) {} 
    final long memTaken = rt.totalMemory() - rt.freeMemory(); 
    System.out.println("Mem taken " + memTaken); 
    return memTaken; 
} 

这可靠地产生我的机器上的数字24。这种方法的优点是,它可以自动考虑对象的有效堆积影响,并考虑所有因素。当然,在信任之前,您应该检查它是否可靠。