Я пытаюсь иметь 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
непосредственно. Когда я сделаю это, сервис не запустится.
Конечно, у кого-то еще была подобная проблема?
После того, как я наконец-то решил эту проблему, я хотел ответить на этот вопрос для других, у кого может возникнуть такая же проблема.
Во-первых, если вы устанавливаете Tomcat на Windows, не используйте .exe
установщик, даже если он продвигается Apache. Он не позволит вам запустить Tomcat под каким-либо другим именем, кроме системной учетной записи, что бы вы ни делали. Похоже, что у системной учетной записи нет прав на запись .hprof
файлов в текущем каталоге, и никакие настройки безопасности Windows не помогут решить эту проблему.
Итак, вы установили Tomcat из дистрибутива .zip
. Установите его как службу с помощью скрипта service.bat
. Убедитесь, что он настроен на запуск от имени определенного пользователя, которого вы создали специально для этой цели. Убедитесь также, что папка, в которую Tomcat будет записывать данные в случае дампа кучи, доступна для записи этим пользователем.
Отредактируйте файл service.bat
, включив в него опции -XX:+HeapDumpOnOutOfMemoryError
и -XX:HeapDumpPath=C:\whatever
в нужном месте (где вы можете поместить опции JVM). Это должно помочь.
от 20 советов по использованию Tomcat в производстве
Добавьте следующее на ваш Java_opts В CATALINA.SH (или CATALINA.BAT для Windows): - xx: + heapdumponoutofmemoryerror -xx: heapdumpphath = / home / j2ee / heapdumps
Вы пробовали -XX:HeapDumpPath?
http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
Я нашел следующую ссылку, которая описывает, как настроить службу Tomcat (включает в себя настройку параметров Java). Не уверен, применяется ли он к версии, которую вы работаете.
http://tomcat.apache.org/tomcat-5.5-doc/windows-service-howto.html
Да, 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
, и добавление к этому будет служить только для усложнения вашего кода в другом месте.
Файлы .hprof
. Точно то, что это означает для службы Windows, это кто-то предполагает, что это ничего значит.
Я предлагаю публиковать новый вопрос (на http://superuser.com ), спрашивая, что означает «текущий каталог» для службы Windows.