是否可以查看对象使用了多少堆?

时间:2011-05-25 23:34:09

标签: java heap

如果我有一个List<Object>,是否可以在每个Object上运行一些方法来查看每个内存消耗多少内存?我对每个对象一无所知它可能是整个视频文件加载到堆上或只是一个双字节字符串。我最终想知道在耗尽内存之前先丢弃哪些对象。

我认为Runtime.totalMemory()显示了JVM当前使用的内存,但我希望看到单个对象使用的内存。

6 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

SoftReference看起来有点像你需要的。创建一个对象的软引用列表,如果这些对象没有在任何地方引用,并且内存不足,JVM将删除其中的一些。我不知道选择删除内容的算法有多聪明,但它也可以删除那些可以释放大部分内存的算法。

答案 2 :(得分:0)

如果您在容器中,可以使用Jconsole http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

自1.5以来的jdk带有堆转储ulits ...你在容器中还是在eclipse中?还有为什么你有一个对象列表?

答案 3 :(得分:0)

没有干净的方法可以做到这一点。您可以创建一个虚拟OutputStream,除了计算写入的字节数之外什么都不做。因此,您可以通过将其序列化为此类流来对您的对象图大小进行一些估算

我不建议在生产系统中这样做。我个人曾经做过一次实验和估算。

答案 4 :(得分:0)

实际上,另一种可能的策略就是对你要检查的类的实例进行废话加载(比如数组中的一百万)。

绝对数量的对象应该消除开销(因为其他东西的开销将远远小于对象的垃圾负载)。

你当然希望单独运行它(即public static main())。

我承认你需要大量的记忆才能进行这项测试。

答案 5 :(得分:-1)

你能做的就是制作一个Map<Object, Long>,将每个对象映射到它的内存大小。

然后要测量特定对象的大小,必须在每个对象的实例化时进行 - 测量之前使用的JVM内存(调用Runtime.totalMemory())和构建对象后(调用Runtime.totalMemory()}并取两者之间的差异 - 即内存中对象的大小。然后将ObjectLong添加到地图中。从那里你应该能够循环遍历地图中的所有键,并使用最大的空间量找到对象。

我不确定在你已经拥有List<Object>之后,每个对象都有办法实现它...我希望这对你有所帮助!