确定java内存使用情况

嗯。 Java中的内存使用是否有任何入门? 我本以为Sun或IBM本来会有一篇关于这个主题的好文章,但我找不到任何看起来非常可靠的文章。 我有兴趣了解两件事:

  1. 在运行时,计算出我的包中的类在给定时间使用了多少内存
  2. 在设计时,估计各种事物的一般内存开销要求,例如:
    • 空对象需要多少内存开销(除了其字段所需的空间)
    • 创建闭包时需要多少内存开销
    • 像ArrayList这样的集合需要多少内存开销

我可能已经创建了数十万个对象,我想成为一个“好邻居”,不要过度浪费RAM。 我的意思是我并不在乎我是否比“最佳情况”(无论是那种情况)使用的内存多10%,但是如果我实现了一些使用5倍内存的东西,如果我做了一个简单的话改变,我想使用更少的内存(或者能够为固定数量的可用内存创建更多对象)。

我发现了一些文章( Java专家的时事通讯和来自Javaworld的内容 )和一个内置类java.lang.instrument.getObjectSize() ,它声称要测量内存使用的“近似”(??),但这些似乎都是有点模糊……

(是的,我意识到在两个不同的操作系统上运行的JVM可能会为不同的对象使用不同的内存量)

我在几年前使用过JProfiler并且做得很好,你可以将内存使用量分解到相当精细的水平。

从Java 5开始,在Hotspot和其他支持它的VM上,您可以使用Instrumentation接口向VM询问给定对象的内存使用情况。 它很繁琐,但你可以做到。 如果你想尝试这种方法,我已经在我的网站上添加了一个页面,使用Instrumentation框架查询Java对象的内存大小 。

作为Hotspot在32位机器上的粗略指南:

  • 对象使用8个字节进行“管家”
  • 字段使用你期望它们使用的位长(尽管布尔值往往被分配整个字节)
  • 对象引用使用4个字节
  • 整体obejct大小的粒度为8个字节(即如果你有一个带有1个布尔字段的对象,它将使用16个字节;如果你有一个带有8个布尔值的对象,它也将使用16个字节)

关于VM如何处理它们,集合没什么特别之处。 它们的内存使用量是它们内部字段的总和加上 – 如果你在计算它 – 它们包含的每个对象的用法。 您需要考虑诸如ArrayList的默认数组大小之类的事情,以及每当列表变满时该大小增加1.5的事实。 但无论是询问虚拟机还是使用上述指标,查看集合的源代码并“通过它”都可以帮助您找到答案。

如果通过“封闭”你的意思是像Runnable或Callable这样的东西,那么它就像一个无聊的旧物体一样。 (NB他们不是真的关闭!!)

您可以使用JMP ,但它只能使用Java 1.5。

我已经使用过几次带有较新版本Netbeans的分析器 ,它运行良好,为您提供大量有关内存使用和程序运行时的信息。 绝对是一个好的开始。

如果您使用的是1.5之前的VM – 您可以使用序列化来获取大小对象。 但是请注意..这可能需要该对象的两倍内存量。

看看PerfAnal是否能满足您的需求。

这可能不是您正在寻找的确切答案,但以下链接的内容将为您提供非常好的指示。 关于记忆的其他问题

我相信Netbeans中包含的分析器也可以监视内存使用情况,你可以尝试一下