Ошибка NetBeans/Glassfish и PermGen при повторном развертывании (да, STILL)

Я знаю, что это, вероятно, было задано много раз раньше, но я до сих пор не видел реального исправления.

Моя повседневная среда разработки выглядит следующим образом: 1. NetBeans (последняя версия), 2. Glassfish (последняя в комплекте с NB), 3. JPA, JSF, JAXB, Jersey для JAX-RS

У меня около 600 классов в моем проекте, которые распространяются на два проекта EJB и один проект WAR, все внутри EAR.

Я нахожусь на последнем JDK 7 (на OS X), и я нахожусь на почасовой основе, получая печально известную ошибку «PermGen space». Предположим, что если я делаю 3 инкрементных повторных развертывания в минуту, я могу работать только на короткое время:

  • У Glassfish заканчивается пространство PermGen, поэтому мне просто нужно убить процесс.
  • Развертывание становится чрезвычайно медленным, из-за того, что я увеличиваю максимальное пространство перменто (как это рекомендуется делать из десятков ответов на S.O.)

Часто единственным решением является уничтожение стеклянной рыбы каждые 30 минут или около того. Это определенно из-за ошибки где-то, которая просто загружает новые классы для каждого нового инкрементного повторного развертывания вместо того, чтобы избавляться от старых. Я думал, что это должно быть исправлено в JDK 7?

Это была ошибка долгое время в среде разработки, и я довольно шокирован тем, что она продолжается и после моего 5-летнего развития Java. Это так расстраивает и невероятно непродуктивно.

( Перед тем, как кто-либо предложит увеличить пространство с пергеном , поверьте, я пробовал это, и единственное, что он «решает», - это продлить неизбежное. Я видел, что повторные развертывания занимают до 400 секунд худшее. Перераспределение должно занимать 5-6 секунд для проекта такого размера, не более.)

EDIT: I ran jmap and jhat on the Glassfish process after the following steps:

  1. Запуск стеклянной рыбы
  2. Разверните мой советник
  3. Развернуть мой советник
  4. Затем сделал кучу кучи с jmap

Оказывается, все мои классы (которые должны были быть выгружены) все еще загружены! Надеюсь, это полезная информация для кого-то, кто читает это ...

2
nl ja de

2 ответы

Конечно, это ошибка, и я не думаю, что для этого есть простое решение. (Если бы это было, возможно, у вас уже было это).

Что вы можете попробовать: используйте инструмент замены горячих кодов , например JRebel . Таким образом, вам не нужно постоянно развертывать, вместо этого этот инструмент отслеживает изменения .class (и даже другие веб-ресурсы, если вы это настроили), а заменяет определение класса в запущенной JVM . Звучит круто, правда?

Он работает как агент Java , он запускается при запуске JVM.

Есть три недостатка этого решения: развертывание немного медленнее, его отлаживать сложнее, и это проприетарное программное обеспечение (но не дорого)

3
добавлено
Мне нужно согласиться с тобой. Протестировал JRebel и до сих пор это фантастика ... Я все еще на испытании, но если это будет хорошо работать, я продаюсь!
добавлено автор T.K., источник
Если вы используете JRebel, убедитесь, что для проекта отключен «Demoy on Save». Кстати, он может сделать намного больше, чем просто заменить классы
добавлено автор Anton Arhipov, источник
Конечно, это возможно, но ключевым моментом является то, что он может избавиться от перераспределения (и утечки).
добавлено автор gaborsch, источник

При разработке с помощью Netbeans + Glassfish и использовании «Deploy on Save» мы обнаружили, что библиотеки, упакованные в приложение, не разгружаются при повторном развертывании проекта; это заставляет GF замедляться и быстро исчерпать память.

Попробуйте отменить «Пакет» для всех библиотек времени компиляции и поместить те, которые еще не находятся в пути класса Glassfish в каталоге domainX/lib.

Не уверен, но это может быть связано с GLASSFISH-17449 или GLASSFISH-16283.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

IDE и редакторы — русскоговорящее сообщество
IDE и редакторы — русскоговорящее сообщество
393 участник(ов)

Общаемся, сравниваем и помогаем друг другу решать задачи с продуктами JetBrains, VS Code, Atom, vim, Emacs, Sublime и т.д. Всё в одном месте, ведь каждый из них хорош по своему. См. также: @js_ru, @typescript_ru, @react_js, @nodejs_ru, @javascript_jobs

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async

Netbeans [RU]
Netbeans [RU]
43 участник(ов)

Сообщество по обсуждению среды разработки Netbeans