2014-01-08 7 views
1

Эта проблема возникает, когда мое веб-приложение работает от 40 минут до часа, и моя веб-приложение не работает, браузер ждет ответа от сервера, я не знаю, не является ли это любая ошибка в программировании, который я делаю, или ошибка в tomcat или ошибка в jvm.java.lang.OutOfMemoryError в tomcat 7

и это исключение:

Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" 
    Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" 
+0

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

+1

OutOfMemoryErrors не происходит ни для чего, а Tomcat используется тысячами людей. Вероятно, проблема связана с вашим кодом или вызвана неправильной конфигурацией. –

+0

Это будет сложно кому-то помочь вам, так как это может быть несколько вещей. Вот несколько вещей, которые нужно проверить: 1) Увеличьте память вашего сервера tomcat, если вы действительно используете столько памяти; 2) включите отладку tomcat и посмотрите, не освобождены ли ресурсы. – wxkevin

ответ

1

Это весьма вероятно, что ваш код. Tomcat и JVM теперь не идут OOM самостоятельно. Вы либо теряете память, либо просто ваше приложение требует слишком много памяти для вашей текущей конфигурации.

0

Поскольку вы говорите, что оно появляется через долгое время (более 40 минут), это может быть вызвано утечками памяти (вы, вероятно, постоянно используете память для объектов и храните его в использовании, чтобы сборщик мусора ничего не мог сделать Это).

3

Очень вероятно, что у вас есть утечка памяти в вашем приложении. Вы должны исследовать, какие объекты едят вам память. Чтобы сделать это, вы должны:

  1. Get кот PID (используйте "JPS -l" или "пс УБ "Grep ява")
  2. Используйте jmap, чтобы показать объекты гистограммы:" jmap -histo: жить | голова -n20"

Тогда вы увидите, где проблема. Она также будет очень полезно, если вы будете проверять ваши настройки памяти? Может быть, ваше приложение просто нужно больше памяти?

0

Это не тривиальный проблема, лучший способ борьбы с ней - попробовать немного посмертного анализа вашего пула объектов после того, как проблема снова возникнет. Я бы использовал jconsole (он бесплатный и включен в каждый современный JDK), и есть другие инструменты.

После того, как у вас есть этот анализ, существует 2 варианта:

  • Вы найдете доказательства того, что некоторые объекты вышли из-под контроля (возможно, кто-то сделал ошибку программирования, и они протекают объекты). A изменение кода должен быть исправлен
  • Все нормально, но оно просто ест много памяти. В этом случае поговорите с вашим оператором (если это не ), чтобы узнать, как определить размер вашей JVM-памяти сервера. Посмотрите на это:

How can I increase the JVM memory?