Подтвердить что ты не робот

Java.lang.OutOfMemoryError: пространство PermGen

В eclipse IDE 3.2 часто возникает ошибка: как я могу сохранить приложение из этих OutOfMemory?

java.lang.OutOfMemoryError: PermGen space
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClassCond(Unknown Source)
    java.lang.ClassLoader.defineClass(Unknown Source)
    java.security.SecureClassLoader.defineClass(Unknown Source)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1814)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
    org.jboss.web.tomcat.service.WebAppClassLoader.findClass(WebAppClassLoader.java:75)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289)
    java.sql.DriverManager.getConnection(Unknown Source)
    java.sql.DriverManager.getConnection(Unknown Source)
    org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
    org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:111)
    org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101)
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325)
    com.mfic.util.HibernateUtil.<clinit>(HibernateUtil.java:16)
    com.mfic.dao.BaseHome.getSession(BaseHome.java:16)
    com.mfic.core.helper.UserManager.findByUserId(UserManager.java:248)
    com.mfic.core.action.Login.authenticate(Login.java:39)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
4b9b3361

Ответ 1

Если вы получаете сомнительную ошибку во вторичном приложении Eclipse, добавление -XX:MaxPermSize=512m в ini не поможет. Вам нужно перейти в debug or run configuration->arguments и добавить эту часть в аргументы VM. Я также увеличил другие ограничения памяти, поэтому:

-Dosgi.requiredJavaVersion=1.5 -Xms120m -Xmx2048m -XX:MaxPermSize=1024m

Это помогло.

Изменить. После некоторых экспериментов, которые я нашел, Eclipse действительно использует ограничения памяти из ini файла. Но... он делает это только один раз, при создании нового рабочего пространства. Параметры из -vmarg в eclipse.ini создают линию параметров VM по умолчанию. Итак, если вы работаете над существующим рабочим пространством, измените настройку debug или run. Но измените eclipse.ini тоже для лучшего будущего.

Ответ 2

В вашем проекте много памяти. Дайте Eclipse больше памяти для работы. Измените eclipse.ini, чтобы изменить или добавить следующие строки ниже -vmargs.

-Xms256m
-Xmx512m
-XX:MaxPermSize=512m

Предполагая, что у вас есть как минимум 2 ГБ ОЗУ.

См. также:

Ответ 3

  • Щелкните экземпляр сервера.
  • Открыть конфигурацию запуска.
  • Увеличьте объем памяти до JVM на вкладке параметров.

-Xms64m -Xmx256m

Смотрите изображения ниже:

enter image description here

Ответ 4

Java-приложениям разрешено использовать только ограниченный объем памяти. Точный объем памяти, которую может использовать ваше конкретное приложение, указывается во время запуска приложения. Чтобы сделать вещи более сложными, память Java разделяется на разные области, одна из которых называется PermGen.

Размер всех этих регионов задается во время запуска JVM. Если вы не укажете явно размеры, будут использоваться значения по умолчанию для платформы.

Итак - сообщение java.lang.OutOfMemoryError: PermGen space указывает, что область Постоянный размер в памяти исчерпан.

Эта область, называемая PemGen, является выделенной областью, где классы Java загружаются и сохраняются. Это состоит из следующего:

  • Имена классов
  • Поля класса
  • Методы класса с байт-кодом методов
  • Информация о постоянном пуле
  • Массивы объектов и массивы типов, связанные с классом
  • Оптимизация компилятора Just In Time

Это в значительной степени. Еще несколько бит и частей, но это не влияет на потребление памяти более чем на несколько процентов. Все они выделены в постоянное поколение и остаются в постоянном поколении.

Как вы можете видеть, требования к размеру постоянного поколения зависят как от количества загруженных классов, так и от размера таких объявлений класса. Таким образом, легко увидеть основную причину такой ошибки: либо слишком много классов, либо слишком большие классы загружаются в постоянное поколение.

Быстрая фиксация симптомов проста - если мы исчерпали область PermGen в куче, нам нужно увеличить ее размер. Это решение действительно полезно, если вы просто не дали вашему JVM достаточно локтевой комнаты. Поэтому измените конфигурацию запуска приложения и добавьте (или увеличите, если присутствует) следующее:

-XX:MaxPermSize=512m

Ответ 5

Это происходит довольно часто при запуске Tomcat внутри Eclipse во время сеансов отладки и т.д. Из памяти это проблема с Sun JVM. Annnyway, там легко исправить:

Просто добавьте следующее ниже -vmargs в eclipse.ini(которое находится в том же каталоге, что и ваш двоичный файл eclipse):

-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled 

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

Надеюсь, это поможет!

Ответ 6

Ответы, вероятно, решат его для вас, но в любом случае, есть интересные интересные ссылки:

Вот статья с большим количеством обсуждений и предложений об этой ошибке: http://www.jroller.com/agileanswers/entry/preventing_java_s_java_lang

Обсуждение примера того, как может произойти ошибка ODM Permgen: http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

Вот фактическое решение, недавно опубликованное в StackOverflow. Это для Tomcat, но может использоваться в Eclipse: Работа с "java.lang.OutOfMemoryError: пространство PermGen" ошибка

Ответ 7

Увеличьте MaxPermSize в eclipse.ini. Я предлагаю установить его на 128M или 256M, если вы можете с ОЗУ

-vmargs -XX:PermSize=64M -XX:MaxPermSize=128M  

Также обратите внимание, что многие люди столкнулись с проблемами PermGen с Eclipse 3.2, как указано в Ошибки Perm-Gen Got You Down?. А поскольку Eclipse 3.2 более 4 лет, я предлагаю перейти на более новую версию (Eclipse 3.6 - это текущая версия).

Ссылки

Ответ 8

А также после проверки вышеуказанных параметров, пожалуйста, проверьте обновленную версию JVM. Я использовал jdk1.6 и столкнулся с той же проблемой. Когда я изменил jvm в eclipse на JDK1.7, он работает нормально.