Как я могу выяснить, что держит несвободные объекты? - PullRequest
14 голосов
/ 30 сентября 2008

Одна из наших программ иногда получает ошибку OutOfMemory на компьютере одного пользователя, но, конечно, не во время ее тестирования. Я только что запустил его с JProfiler (на 10-дневной пробной лицензии, потому что я никогда не использовал его) и отфильтровал по нашему префиксу кода, самый большой кусок как по общему размеру, так и по количеству экземпляров составляет более 8000 экземпляров определенного простого класса ,

Я нажал кнопку «Сбор мусора» на JProfiler, и большинство других наших классов исчезли, но не эти особые. Я снова запустил тест, все еще в том же экземпляре, и он создал более 4000 экземпляров класса, но когда я нажал «Сбор мусора», они ушли, оставив более 8000 экземпляров.

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

Какие-нибудь предложения, как я могу выяснить, что держит ссылку? Я ищу предложения о том, что искать в коде, а также способы выяснить это в JProfiler, если есть.

Ответы [ 11 ]

0 голосов
/ 30 сентября 2008

Если вы получаете ошибки OOM на языке сборки мусора, это обычно означает, что сборщик не учитывает некоторую память. Может быть, ваши объекты содержат не Java-ресурсы? если это так, то у них должен быть какой-то метод 'close', чтобы убедиться, что ресурс освобожден, даже если объект Java не собран достаточно быстро.

...