【问题标题】:Finding objects having same values in heap dump在堆转储中查找具有相同值的对象
【发布时间】:2010-07-14 10:37:45
【问题描述】:

我想减少内存中的对象数量。可能有许多具有相同值的对象。有没有办法找出堆转储中具有相同值的所有对象。

【问题讨论】:

    标签: java performance heap-dump


    【解决方案1】:

    我想减少内存中的对象数量。可能有许多具有相同值的对象。

    我假设您的长期目标是通过仅保留具有相同值的对象的一份副本来让您的应用程序节省内存。

    这个想法的问题在于,您通常需要构建/维护一个额外的数据结构,以便您可以找到具有相同值的先前对象。例如,一个 HashMap。 (像 Guava interner 这样的现成解决方案在幕后是相同的。)如果您不小心,此数据结构可能会使用比您通过消除重复项节省的内存更多的内存。

    此外,它没有正确实现,“内部”数据结构可能会通过阻止对象被垃圾回收来有效地泄漏内存。内存泄漏问题的解决方案都涉及在某种程度上使用 Wea​​kReferences 等。这意味着更多的对象和更慢的垃圾收集。后者是因为 1)interned 对象需要被 GC 跟踪,2)interned 对象往往寿命更长,更有可能最终在老年代结束,3)WeakReference 实例对于 GC 来说相对昂贵处理。

    总之,注意不要让你的记忆问题变得更糟!

    【讨论】:

    • @nanda - 是的,但你仍然需要小心在哪里使用它。
    • @nanda - 分析器无法预测实习是否会节省内存。
    • 但它可以显示你有多少个对象的副本,这是一个可以用来确定你是否尝试实习解决方案的信息
    【解决方案2】:

    使用分析器。我可以说 YourKit 有这个功能。

    【讨论】:

    • 我在他们的网站上看不到任何提及,只有内存中字符串和数组的文本搜索功能(仅)。如果我理解正确,此功能将依赖于与分析器集成的内部人员。
    【解决方案3】:

    查看方法Integer.valueOf(int i) 的Sun/Oracle Java 实现。它已经有一个预先确定的流行值缓存(从 -128 到 127),因此在为这些值调用该方法时不会创建新实例。

    这表明,如果您在创建对象时小心翼翼,那么您可以减少内存占用。也许您应该调查对象是如何创建的,并尝试在创建时缓存它们。也许通过查看流行的用例,或对应用程序行为方式的一些分析。这将取决于应用程序,并且对于您来说是否会有一个开箱即用的解决方案是值得怀疑的。我相信从长远来看,这将为您节省一些精力,而不是试图找出当前占用太多空间的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多