Что может быть сделано с 'PermGen из пространства' исключение в веб-приложении Tomcat-Spring-Hibernate?

Привет Дополнительный Мир

, Если Вы хотите, чтобы время выполнения предоставило значение параметра по умолчанию, необходимо использовать отражение для совершения вызова. Не столь хороший как другие предложения для этого вопроса, но совместимый с VB.NET.

using System;
using System.Runtime.InteropServices;
using System.Reflection;

namespace ConsoleApplication1
{
    class Class1
    {
        public static void sayHelloTo(
            [Optional,
            DefaultParameterValue("world")] string whom)
        {
            Console.WriteLine("Hello " + whom);
        }

        [STAThread]
        static void Main(string[] args)
        {
            MethodInfo mi = typeof(Class1).GetMethod("sayHelloTo");
            mi.Invoke(null, new Object[] { Missing.Value });
        }
    }
}
22
задан bluish 24 February 2011 в 14:02
поделиться

7 ответов

-XX: MaxPermSize действительно работает, вам просто нужно получить правильное значение. По умолчанию, я считаю, что это 32 МБ для виртуальной машины в режиме клиента и 64 МБ для виртуальной машины в режиме сервера. Я предлагаю установить его на 256 МБ, если у вас есть память:

java -XX:MaxPermSize=256m

Проблема возникает из-за того, что Spring и Hibernate могут интенсивно использовать классы, созданные во время выполнения, а иногда и очень много. Все эти сгенерированные классы попадают в пул памяти PermGen, поэтому, если вы используете эти фреймворки, вам часто нужно увеличивать PermGen до больших объемов.

19
ответ дан 29 November 2019 в 05:00
поделиться

Я видел эту проблему с Hibernate (используется без Spring). Проблема заключалась в том, что мы создавали экземпляр SessionFactory для каждого пользовательского запроса, а не создавали единственный экземпляр на время существования приложения.

Я использовал профилировщик YourKit чтобы исследовать это и обнаружить проблему.

4
ответ дан 29 November 2019 в 05:00
поделиться

Как говорит скаффман, свойство -XX: MaxPermSize действительно работает, однако иногда у вас может возникнуть основная проблема, из-за которой повышение лимита может только отложиться.

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

  • Поместите драйвер JDBC в common / lib (как сказано в документации tomcat ), а не в WEB-INF / lib
  • Не помещайте общие журналы в WEB-INF / lib, поскольку tomcat уже загружает его
3
ответ дан 29 November 2019 в 05:00
поделиться

Visual GC, теперь часть JDK 6, дает очень красивое графическое представление памяти в реальном времени. Вы можете увидеть, что происходит с райским уголком, поколениями и перманентным пространством. Вы просто не поймете почему.

ОБНОВЛЕНИЕ: это bin / jvisualvm.exe в моем дистрибутиве JDK 1.6.0_13. Дайте ему PID процесса, который вы хотите отслеживать.

2
ответ дан 29 November 2019 в 05:00
поделиться

All responses here relates to PermGen problem that happens because of several restarts of web-app, but in this case the problem already happens on first deployment after tomcat restart, so it can't be the problem of ClassLoader's references or commons-logging.

0
ответ дан 29 November 2019 в 05:00
поделиться

Если вы работаете на jdk6, вы можете использовать приложение jconsole для отслеживания использования памяти приложением и дальнейшего исследования.

Еще один путь, которым следует заняться, - использовать профилировщик, я используйте JProfiler и посмотрите на приложение с этим. Он скажет вам, в чем именно заключается проблема.

0
ответ дан 29 November 2019 в 05:00
поделиться

Вы Следует помнить, что в некоторых версиях Tomcat возникают утечки памяти при передислокации во время войны. Это случилось со мной на tomcat 6.0.x.

Как было предложено увеличить MaxPermSize , это временное решение для вашей машины разработки - и когда вы получите сообщение об ошибке, через 2-3 дня просто перезапустите сервер. На производстве не все так просто. Итак, этот работает для разработки , но этот подход не работает для производственной среды , где вы должны исправить проблемы с утечками памяти.

Для обнаружения утечек используйте Приложение jconsole , которое поставляется с jdk 1.6 и 1.5. Вы можете выполнить привязку к процессу и наблюдать за использованием памяти с течением времени.

Вы также можете прочитать это:

8
ответ дан 29 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

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