计算物体的“重量”,如何[重复]
Posted
技术标签:
【中文标题】计算物体的“重量”,如何[重复]【英文标题】:Calculating 'weight' of an object, howto [duplicate] 【发布时间】:2012-06-30 10:07:58 【问题描述】:可能重复:In Java, what is the best way to determine the size of an object?
假设您有一个数据结构,允许您向其中添加数据,比如一个列表:
List<KeyValuePair>
由于系统的客户端实际上添加了内容......在某些时候,JVM会耗尽内存,这只是何时发生的问题。最好定期将包含此列表的对象保存到磁盘和gc
其余部分。
使用 Java,是否可以估计一个对象现在占用了多少内存?
【问题讨论】:
您真的要估计对象的大小吗?似乎要问的正确问题是“鉴于我有一个巨大的对象,我怎么知道什么时候该将它写入磁盘并丢弃它?” 很公平,但我确实需要知道“巨大”是什么意思,对吧? 重复:***.com/questions/52353/… 【参考方案1】:getObjectSize()
方法可能正是您想要的。
引用Interface Instrumentation 文档:
getObjectSize(Object objectToSize) 返回指定对象消耗的存储量的特定于实现的近似值。
【讨论】:
【参考方案2】:您正在寻找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
但是为了能够使用它:
访问 Instrumentation 接口实例的唯一方法是 以指示代理类的方式启动 JVM - 见包装规格。 Instrumentation 实例已通过 到代理类的 premain 方法。一旦代理获得 Instrumentation 实例,代理可以调用实例上的方法 随时。
良好的实施示例: http://www.javalobby.org/java/forums/t19309.html
【讨论】:
您能举个例子吗? 当我需要此功能时,我会按照本教程进行操作:javalobby.org/java/forums/t19309.html【参考方案3】:您可以通过制作许多相同的对象并测量所占用的内存来做到这一点。我已经多次使用这种技术,结果稳定、可重复。在大纲中,
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。这种方法的优点是它会自动考虑对象对堆的有效影响,并将所有因素都考虑在内。当然,在信任它之前,您应该检查它在您的设置中是否可靠。
【讨论】:
以上是关于计算物体的“重量”,如何[重复]的主要内容,如果未能解决你的问题,请参考以下文章