2010-07-14 43 views

回答

1

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

+0

我在他们的网站上看不到任何提及,只有内存中的字符串和数组(仅)的文本搜索功能。如果我理解正确,这个特性将依赖于一个与探查器集成的interner。 – finnw 2010-07-14 14:02:48

2

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

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

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

此外,它没有正确实施,“实习”数据结构可能会通过防止对象被垃圾收集来有效泄漏内存。内存泄漏问题的解决方案都涉及在某个级别使用WeakReferences等。这意味着更多的对象和更慢的垃圾收集。后者是因为1)需要由GC跟踪被拦截的对象,2)被拦截的对象倾向于寿命更长,并且更有可能最终在老一代中,以及3)WeakReference实例对于GC而言相对昂贵处理。

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

+1

从谷歌guava使用Interner更容易:) – nanda 2010-07-14 10:50:07

+0

@nanda - 好的,但你仍然需要小心*你在哪里使用它。 – 2010-07-14 12:51:34

+0

这就是探查器的用途 – nanda 2010-07-14 13:03:14

0

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

这表明,如果您在创建对象时非常小心,那么您可以保留内存占用空间。也许你应该调查你的对象是如何创建的,并尝试在创建时缓存它们。也许通过查看流行的用例,或者应用程序行为方式的一些分析。这将取决于应用程序,并且对于您将有一个开箱即用的解决方案存在怀疑。我相信这会为你节省一些长期的努力,而不是试图解决目前占用太多空间的问题。

相关问题