Одна из наших программ иногда получает ошибку OutOfMemory
на машине одного пользователя, но, конечно, нет, когда я ее тестирую. Я просто запускал его с помощью JProfiler (на 10-дневной оценочной лицензии, потому что я никогда не использовал ее раньше) и отфильтровывая наш префикс кода, самый большой кусок как в общем размере, так и в количестве экземпляров - это 8000+ экземпляров определенного простого класса ,Как я могу понять, что держится на незакрепленных объектах?
Я нажал кнопку «Сбор мусора» на JProfiler, и большинство экземпляров других классов ушли, но не эти конкретные. Я снова проверил тест, все еще в том же экземпляре, и создал еще 4000 экземпляров класса, но когда я нажал «Сбор мусора», они ушли, оставив исходные 8000+.
Эти экземпляры застряли в различных Коллекциях на разных этапах. Я предполагаю, что тот факт, что они не собираются с мусором, должен означать, что что-то держится за ссылку на одну из коллекций, поэтому она держится за ссылку на объекты.
Любые предложения, как я могу выяснить, что держится за ссылку? Я ищу предложения о том, что искать в коде, а также способы найти это в JProfiler, если они есть.
Если вы ищете бесплатный профайлер, я предлагаю вам ознакомиться с http://jiprof.sourceforge.net/. Может быть, немного старомодный, не причудливый gui и так далее, но работающий в большинстве случаев. – dhiller 2008-10-01 10:53:41