计算物体的“重量”,如何[重复]

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。这种方法的优点是它会自动考虑对象对堆的有效影响,并将所有因素都考虑在内。当然,在信任它之前,您应该检查它在您的设置中是否可靠。

【讨论】:

以上是关于计算物体的“重量”,如何[重复]的主要内容,如果未能解决你的问题,请参考以下文章

最优装载问题---贪心算法

第八章 贪心法

根据重量获取项目的频率[重复]

通过For循环修改Pandas系列[重复]

是否可以仅使用相机来测量物体与安卓手机的距离[重复]

如何定义阈值以仅检测图像中的绿色对象:Opencv [重复]