【问题标题】: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,是否可以估计一个对象现在占用了多少内存?

【问题讨论】:

  • 您真的要估计对象的大小吗?似乎要问的正确问题是“鉴于我有一个巨大的对象,我怎么知道什么时候该将它写入磁盘并丢弃它?”
  • 很公平,但我确实需要知道“巨大”是什么意思,对吧?

标签: java memory-management garbage-collection


【解决方案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

    【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 2021-01-29
      • 2018-09-01
      • 2017-01-08
      • 1970-01-01
      • 2011-12-29
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多