Поиск объектов с одинаковыми значениями в дампе кучи

Я хочу уменьшить количество объектов в памяти. Может быть много объектов, имеющих одинаковые значения. Есть ли способ узнать все объекты, которые имеют одинаковые значения в дампе кучи.

3 ответа

Я хочу уменьшить количество объектов в памяти. Может быть много объектов, имеющих одинаковые значения.

Я предполагаю, что ваша долгосрочная цель состоит в том, чтобы ваше приложение сэкономило память, сохраняя только одну копию объектов с одинаковым значением.

Проблема с этой идеей заключается в том, что вам обычно требуется создать / поддерживать дополнительную структуру данных, чтобы вы могли найти предыдущий объект с тем же значением. Например, HashMap. (Готовые решения, такие как Guava interner, одинаковы.) Если вы не будете осторожны, эта структура данных может использовать больше памяти, чем вы экономите, удаляя дубликаты.

Кроме того, это не реализовано должным образом, "внутренняя" структура данных может эффективно утратить память, предотвращая сбор мусора объектов. Все решения проблемы утечки памяти включают использование WeakReferences и т. Д. На каком-то уровне. А это означает еще больше объектов и более медленную сборку мусора. Последнее связано с тем, что 1) интернированные объекты должны отслеживаться GC, 2) интернированные объекты имеют тенденцию жить дольше и с большей вероятностью окажутся в старом поколении, и 3) экземпляры WeakReference относительно дороги для GC иметь дело с.

Итак, позаботьтесь о том, чтобы ваши проблемы с памятью не усугублялись!

Используйте профилировщик. Я могу сказать, что YourKit имеет эту функциональность.

Посмотрите на реализацию Sun/Oracle Java для метода Integer.valueOf(int i), Он уже имеет заранее определенный кэш популярных значений (от -128 до 127), поэтому при вызове этого метода для этих значений не создаются новые экземпляры.

Это показывает, что если вы осторожны в создании объектов, то можете уменьшить объем памяти. Возможно, вам следует изучить, как создаются ваши объекты, и попытаться их кэшировать во время создания. Возможно, глядя на популярные варианты использования или некоторые профили поведения приложения. Это будет зависеть от приложения, и сомнительно, что для вас найдется готовое решение. Я считаю, что в конечном итоге это сэкономит вам некоторые усилия, вместо того, чтобы пытаться решить, что в настоящее время занимает слишком много места.

Другие вопросы по тегам