我想减少内存中的对象数量。可能有许多具有相同值的对象。有没有办法找出堆转储中具有相同值的所有对象。
3 回答
我想减少内存中的对象数量。可能有许多具有相同值的对象。
我假设您的长期目标是通过仅保留具有相同值的对象的一份副本来让您的应用程序节省内存。
这个想法的问题是您通常需要构建/维护一个额外的数据结构,以便您可以找到具有相同值的先前对象。例如,一个 HashMap。(像 Guava interner 这样的现成解决方案在幕后是相同的。)如果您不小心,此数据结构可能会使用比您通过消除重复项节省的内存更多的内存。
此外,它没有正确实现,“内部”数据结构可能会通过防止对象被垃圾收集来有效地泄漏内存。内存泄漏问题的解决方案都涉及在某种程度上使用 WeakReferences 等。这意味着更多的对象和更慢的垃圾收集。后者是因为 1)interned 对象需要被 GC 跟踪,2)interned 对象往往寿命更长,更有可能最终在老年代结束,3)WeakReference 实例对于 GC 来说相对昂贵来处理。
总之,注意不要让你的记忆问题变得更糟!
使用分析器。我可以说 YourKit 有这个功能。
查看该方法的 Sun/Oracle Java 实现Integer.valueOf(int i)
。它已经有一个预先确定的流行值缓存(从 -128 到 127),因此在为这些值调用该方法时不会创建新实例。
这表明,如果您在创建对象时小心翼翼,那么您可以减少内存占用。也许您应该调查对象是如何创建的,并尝试在创建时缓存它们。也许通过查看流行的用例,或对应用程序行为方式的一些分析。这将取决于应用程序,并且是否会有适合您的开箱即用解决方案是值得怀疑的。我相信从长远来看,这将为您节省一些精力,而不是试图找出当前占用太多空间的内容。