Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > tomcat hot redeploy class unload permgen space


Автор: gelo86 9.1.2010, 17:08
Вот возник вопрос. Всем приходилось использовать томкат (по своей или нет воли smile ). После изменения кода, ми создаем вар. Из томката стераем старый вар и разпакованнаю директорию и закачиваю новий вар. Томкат ловит и деплоит новий вар. Но ведь ми джаву неостонавливали и в памяти остались старые классы (в permgen space). Если там они есть, то джава нових недолжа загружать, но почему все таки все работает ?

Автор: MaxPayneC 9.1.2010, 17:41
Вероятно, при редеплое приложение перезапускается, прибивая все поколения.

Автор: COVD 9.1.2010, 18:28
Вы только удаляете старый war. Томкат, обнаружив это, сам удаляет папку приложения и соответствующий xml файл приложения в папке conf. Также выгружает из памяти классы, относящиеся к приложению. Это называется undeploy. При завершении процесса выдается сообщение в консоле Томката.
Затем вы кладете новый war в webapp. Опять Томкат сам все распакует и загрузит и сообщит в консоле. 
Короче, не надо Томкату помогать. Процесс редеплоя осуществлятся последовательно в два шага: 1-удалить старый war, 2-положить новый war.  

Автор: gelo86 10.1.2010, 13:37
А аткуда томкат знает, какие класы выкинуть с памяти ? томкат ведь ета прога на джаве, разве сама программа может записывать и стирать информацию с permgen space ? Может подскажете API для етого ?

Автор: Egik2 10.1.2010, 15:17
Хееххх...
Просто к слову поделюсь собственным опытом, как переполняется permgen.
Пишу на IDEA 8.14, редеплою автоматически, через ide, при этом как раз память 
не освобождается, а постоянно растет, с каждым редеплоем, пока не рухнет tomcat.
Тож не знаю, как это решить, если кто поможет буду очень благодарен  smile 

Автор: chand0s 11.1.2010, 14:05
Цитата(Egik2 @ 10.1.2010,  13:17)
Тож не знаю, как это решить, если кто поможет буду очень благодарен  smile

1) Можно увеличить PermGen Space. Это не решает проблему, но позволяет иметь больше deploy/redeploy циклов, что при разработке довольно удобно
2) Можно попробовать заменить JRE. Скорее всего у вас - Sun JRE, попробуйте заменить ее на JRockit.

Вообще, лучше всего почитать вот тут
http://www.jroller.com/agileanswers/entry/preventing_java_s_java_lang
http://blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java

Автор: COVD 11.1.2010, 16:53
Попробуйте редеплоить в отдельно установленном Томкате (а не из IDE). Желательно установленном на другом компьютере smile .  Если память не чистится, что-то же держит обьекты?  
А возможно это "плата" за усложнение веб - приложения. Все эти фреймворки до добра не доводят.  smile 

Автор: Tony 11.1.2010, 22:26
Топик стартер, почитайте про class loader'и. Тогда станет ясно, как томкат убивает старый код и земеняет его новым. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)