Я могу заставить Tomcat, работающий как услуга выводить "кучу"?

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

(Tomcat выполняет Гудзон, который сообщает о проблеме пространства "кучи" в заключительной части моей сборки. Выполнение сборки вручную не производит такой ошибки. Гудзонским парням нужен дамп "кучи" для начала работы.)

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

Я пойман в выгоде 22: Мне нужен дамп "кучи" для Гудзонских парней для фиксации их утечки памяти, но я не могу получить дамп "кучи", если я выполняю Гудзон под Tomcat.

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

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

Конечно, у кого-то еще была подобная проблема?

10
задан Laird Nelson 31 January 2010 в 15:32
поделиться

5 ответов

После того, как я наконец-то решил эту проблему, я хотел ответить на этот вопрос для других, у кого может возникнуть такая же проблема.

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

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

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

6
ответ дан 4 December 2019 в 01:57
поделиться

от 20 советов по использованию Tomcat в производстве

Добавьте следующее на ваш Java_opts В CATALINA.SH (или CATALINA.BAT для Windows): - xx: + heapdumponoutofmemoryerror -xx: heapdumpphath = / home / j2ee / heapdumps

0
ответ дан 4 December 2019 в 01:57
поделиться

Вы пробовали -XX:HeapDumpPath?

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

2
ответ дан 4 December 2019 в 01:57
поделиться

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

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

1
ответ дан 4 December 2019 в 01:57
поделиться

Да, CPTR станет недействительным, поскольку RealLoc перемещает блок! И нет, нет упоминания о сигнализации вам, чтобы сказать, что он перемещает блок памяти. Кстати, ваш код выглядит IFFY ... Читать дальше ... Пожалуйста, смотрите мой Ответ на другой вопрос и очень внимательно прочитайте код, как он использует Realloc . Общий консенсус - это если вы сделаете это:

void *ptr = malloc(1024);

/* later on in the code */

ptr = realloc(ptr, 4096);

/* BAM! if realloc failed, your precious memory is stuffed! */

Способ обойти, это использовать временный указатель и использование, что, как показано:

void *ptr = malloc(1024);

/* later on in the code */

void *tmp = realloc(ptr, 4096);

if (tmp != null) ptr = tmp;

Редактирование: Спасибо Безопасное для указания Гремлин, который подкрался, когда я печатал это ранее.

-121--2218472-

Вот пост, который объясняет рассуждение по решению: http://mail.python.org/pipermail/python-dev/2004-februer/042537.html

Идея состоит в том, что Bool имеет конкретную цель - быть true или FALSE , и добавление к этому будет служить только для усложнения вашего кода в другом месте.

-121--1472622-

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

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

0
ответ дан 4 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: