计算对象的“权重”,如何

可能重复:
在Java中,确定对象大小的最佳方法是什么?

假设您有一个数据结构,允许您向其添加数据,比如一个列表:

List 

由于系统的客户端实际上添加了内容…在某些时候,JVM将耗尽内存,这只是一个问题,何时会发生这种情况。 定期将包含此列表的对象保存到磁盘并将其余部分保存为gc会很好。

使用Java,是否可以估计对象现在占用多少内存?

您正在寻找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

getObjectSize()方法可能正是您正在寻找的方法。
从Interface Instrumentation文档中引用:

getObjectSize(Object objectToSize)
返回指定对象占用的存储量的特定于实现的近似值。

您可以通过制作大量相同的对象并测量所记忆的内存来实现。 我现在已经多次使用这种技术,具有稳定,可重复的结果。 在一个大纲中,

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