【问题标题】:determining java memory usage确定java内存使用情况
【发布时间】:2010-09-28 06:34:58
【问题描述】:

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

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

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

我发现了几篇文章(Java Specialists' Newsletter 和来自Javaworld 的一些文章)和一个内置类java.lang.instrument.getObjectSize(),它声称可以测量内存使用的“近似值”(??),但这些看起来都像是模糊...

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

【问题讨论】:

标签: java memory


【解决方案1】:

我在几年前使用过JProfiler,它做得很好,您可以将内存使用情况细分到相当精细的水平。

【讨论】:

    【解决方案2】:

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

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

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

    就 VM 如何处理它们而言,集合并没有什么特别之处。它们的内存使用量是它们内部字段的总和——如果你计算这个——它们包含的每个对象的使用量。您需要考虑诸如 ArrayList 的默认数组大小之类的因素,以及当列表变满时该大小增加 1.5 的事实。但是,无论是询问 VM 还是使用上述指标,查看集合的源代码并“完成它”,基本上都会让您找到答案。

    如果您所说的“闭包”是指 Runnable 或 Callable 之类的东西,那么它就像其他任何对象一样只是一个无聊的旧对象。 (注意,它们并不是真正的闭包!!)

    【讨论】:

    • (清理旧的未被接受的问题:如果你能指出我在 32 位机器上使用热点对象的来源,我会接受这个,例如 8 个字节用于内务管理 + 4 个字节用于 objrefs + 8字节粒度)
    • 这些实际上来自 Hotspot 源代码中的结构,尽管它们已通过实际测量得到证实。显然,这些数字仅适用于 32 位版本。我承认我不知道 Java 7 中是否有任何改变,尽管我没想到。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我已经多次使用新版本的 Netbeans 附带的profiler,它运行良好,为您提供了大量有关内存使用和程序运行时的信息。绝对是一个不错的起点。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          看看PerfAnal 是否会给你想要的东西。

          【讨论】:

          • 这看起来像是一个分析 CPU 使用情况的好工具,但它是否也分析内存使用情况?我浏览了这篇文章,看起来不像。
          【解决方案7】:

          这可能不是您正在寻找的确切答案,但以下链接的博文将为您提供很好的指导。 Other Question about Memory

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2023-03-21
              • 2010-11-26
              • 2011-01-30
              • 2018-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-14
              • 2019-04-18
              相关资源
              最近更新 更多