Могу ли я заставить Tomcat работать как сервис для сброса кучи?

Я пытаюсь иметь Tomcat, который в настоящее время запущен как служба в окне Windows 2003, куча дампа на OutOfMemoryError.

(Tomcat запускает Hudson, который сообщает о проблеме с кучей пространства в конце моей сборки. Запуск сборки вручную не вызывает такой ошибки. Ребятам из Hudson нужен куча кучи для начала работы.)

Как указано в другом месте, я сказал Apache Service Monitor настроить JVM, который он использует для запуска Tomcat в кучу дампа, когда встречается OutOfMemoryError, добавляя следующие параметры JVM: -XX: + HeapDumpOnOutOfMemoryError Затем я снова запускаю сборку. Конечно же, он сообщает, что была ошибка кучи. Я просматриваю весь диск, ища файл java_pid123.hprof по умолчанию (где, очевидно, 123 заменяется PID JVM). Нет файлов .hprof.

Я поймал уловку 22: мне нужен куча кучи для парней Hudson, чтобы исправить утечку памяти, но я не могу получить кучу кучи, если я запустил Hudson под Tomcat.

Есть ли какой-то особый способ, когда Tomcat работает как служба Windows, чтобы получить кучу дампа из него в OutOfMemoryError?

Другое, что я пробовал, - это сказать на вкладках "Запуск и завершение", чтобы использовать опцию "Java" вместо опции "jvm". Я считаю, что это должно сказать Service Manager, чтобы попытаться запустить Tomcat с исполняемой командой Java, а не запускать jvm.dll напрямую. Когда я это сделаю, служба не запустится.

Несомненно, у кого-то была аналогичная проблема?

Ответ 1

Наконец, положив эту кровать, я хотел ответить на это тем, кто может иметь ту же проблему.

Во-первых, если вы устанавливаете Tomcat в Windows, не используйте установщик .exe, даже если он поддерживается Apache. Это не позволит вам запускать Tomcat как нечто, отличное от системного, независимо от того, что вы делаете. Похоже, что системная учетная запись не имеет привилегий для записи файлов .hprof в текущем каталоге, и никакая проверка безопасности Windows не вызывает проблемы.

ОК, поэтому вы установили Tomcat из дистрибутива .zip. Установите его как услугу, используя service.bat script. Убедитесь, что он настроен на запуск как определенный пользователь, созданный специально для этой цели. Убедитесь также, что папка, которую вы хотите, чтобы Tomcat записывал в случае кучи кучи, доступен для записи этим пользователем.

Отредактируйте файл service.bat, чтобы включить параметры -XX:+HeapDumpOnOutOfMemoryError и -XX:HeapDumpPath=C:\whatever в нужное место (где вы можете установить параметры JVM). Это должно сделать трюк.

Ответ 3

Я нашел следующую ссылку, в которой описывается, как настроить службу tomcat (включая настройку параметров java). Не уверен, что это относится к версии, которую вы используете.

http://tomcat.apache.org/tomcat-5.5-doc/windows-service-howto.html

Ответ 4

Файлы .hprof сбрасываются в текущем каталоге. Точно, что это значит для службы Windows, кто-то догадывается, предполагая, что это что-то значит.

Я предлагаю опубликовать новый вопрос (на http://superuser.com), спрашивая, что означает "текущий каталог" для службы Windows.

Ответ 6

если вы установили tomcat с .exe, вы можете настроить службу tomcat для использования учетной записи, отличной от локальной системной, и вы можете назначить права этого пользователя в каталоге "c:\whatever", где вы создаете файл дампа. одна вещь здесь, чтобы помнить, что сервис tomcat не запускается с учетной записью, имеющей административные привилегии. поэтому создайте простого пользователя в окнах (член группы пользователей) и установите для пользователей эту учетную запись услуги tomcat. и предоставить права этого пользователя в каталоге "c:\whatever". Это устраняет проблему прав каталога пользователя, но вам нужно настроить tomcat для ошибок дампов памяти.

Ответ 7

Когда java-процесс работает как служба окна, вы можете сгенерировать heapdump с помощью следующих шагов:

  • Запустите консоль в качестве администратора
  • версия JDK (для команды jmap) и JRE (среда выполнения приложений Java) должна быть такой же.
  • Получить PID без запуска процесса окна для этого приложения Java из диспетчера задач
  • Выполните команду ниже

jmap -dump: file = d:\heapdump\myHeapDump.hprof -F #PID_No #

Если вы получили какое-либо исключение с JDK/JRE 7, попробуйте то же самое с JDK/JRE 8  На самом деле я столкнулся с некоторой проблемой в jmap с JDK 7, но когда я перешел на JDK 8, мне удалось успешно сгенерировать дамп кучи, используя ту же команду