Вы должны получить дамп памяти и проанализировать его с помощью таких инструментов, как JConsole JVisualVM .
Область действия метода run()
остается до Thread.sleep(day);
, и поэтому любые переменные внутри этого метода уничтожаются. После этого a
больше не будет существовать, и, таким образом, объект, на который ссылается эта переменная , может иметь право на сборку мусора , если на него нет другой ссылки .
Анализ дампа памяти должен позволить вам найти любые ссылки на эти объекты, если они все еще существуют.
С таким же успехом могут быть не те объекты, а другие, которые остаются живыми и которые пожирают память. Это зависит от того, что вы на самом деле делаете, и здесь может быть сложно проанализировать. Таким образом, обратите внимание на огромные графы объектов с точки зрения использования памяти.
Например, у нас была проблема с соединениями с базами данных, которые создавались часто (механизм восстановления XA), и мы думали, что они будут уничтожены, как только область действия метода останется. Тем не менее, сервер поместил эти соединения в статический список и никогда не очищал его, и поэтому у нас действительно не было памяти в ближайшее время. Что помогло нам идентифицировать этот случай, так это анализ дампа памяти. :)