Java 在堆转储中查找具有相同值的对象

Java 在堆转储中查找具有相同值的对象,java,performance,heap-dump,Java,Performance,Heap Dump,我想减少内存中对象的数量。可能有许多对象具有相同的值。有没有办法找出堆转储中具有相同值的所有对象 使用探查器。我可以说你的工具包有这个功能 我想减少内存中对象的数量。可能有许多对象具有相同的值 我假设您的长期目标是通过只保留具有相同值的对象的一个副本来让应用程序节省内存 这种想法的问题在于,您通常需要构建/维护一个额外的数据结构,以便可以找到具有相同值的前一个对象。例如,HashMap。(像Guava interner这样的现成解决方案实际上是一样的。)如果您不小心,此数据结构可能会使用比您通过

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

使用探查器。我可以说你的工具包有这个功能

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

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

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

此外,如果没有正确实现,“内部”数据结构可能会通过防止对象被垃圾收集而有效地泄漏内存。内存泄漏问题的解决方案都涉及在某种程度上使用weakreference等。这意味着更多的对象和更慢的垃圾收集。后者是因为1)被插入的对象需要被GC跟踪,2)被插入的对象往往寿命更长,更可能在旧一代中结束,3)被GC处理的WeakReference实例相对昂贵


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

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


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

@nanda-是的,但您仍然需要小心使用它。@nanda-探查器无法预测是否会节省内存。但它可以显示您有多少个对象的副本,这是一个可以用来确定你是否尝试实习解决方案的信息。我在他们的网站上看不到这方面的任何提及,只有一个针对内存中字符串和数组(仅)的文本搜索功能。如果我理解正确,这个特性将依赖于与分析器集成的interner。