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