Это * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '' '' * 1007 »* *1007* *1005* *1005* *1005* *1005* *1005* *1005* *» (*1007* "), а при отключении приложений Java EE» ( ") * * * * '' '.По всей видимости, загрузчик классов, который загрузил класс singleton, сохранит ссылку на класс, и, следовательно, экземпляр singleton никогда не будет собран.При развертывании нового экземпляра приложения обычно создается новый загрузчик классов, и прежний загрузчик классов будет продолжать существовать из-за синглтона.
1) Я не понимаю, как я могу« unload » синглтона и что означает «, закрывающее приложение Java EE ».Не могли бы вы предоставить примеры кода (неправильные и правильные примеры кода) и сценарии?
2) Из того же сообщения stackoverflow:
Возьмите любое веб-приложение, работающее влюбой контейнер сервлетов (Tomcat, Jetty, Glassfish, что угодно ...).Повторно развертывайте приложение 10 или 20 раз подряд (может быть достаточно просто прикоснуться к WAR в каталоге автоматического развертывания сервера.
Если никто не проверял это на самом деле, велика вероятность того, что вы получите OutOfMemoryError посленесколько повторных развертываний, потому что приложение не позаботилось о том, чтобы очистить после себя. В этом тесте вы можете даже обнаружить ошибку на вашем сервере.
Проблема в том, что время жизни контейнера больше, чемвремя жизни вашего приложения. Вы должны убедиться, что все ссылки, которые контейнер может иметь на объекты или классы вашего приложения, могут быть собраны сборщиком мусора.
Если есть только одна ссылкаВыжившие после отключения вашего веб-приложения , соответствующий загрузчик классов и, как следствие, все классы вашего веб-приложения не могут быть собраны сборщиком мусора.
Потоки, запускаемые вашим приложением, переменные ThreadLocal, добавление журналов - некоторые из обычныхподозревает, что может вызвать утечку из загрузчика классов.
Я не могу понять, как это возможно, что контейнер (классы / объекты Tomcat) содержит ссылки на объекты или классы моего приложения, и это моя вина.Автоматическое управление памятью означает, что мне не нужно заботиться об освобождении памяти, верно?Так о чем мне позаботиться, если мое приложение будет запущено в Tomcat или другом контейнере?