Grails — dbm-gorm-diff работает с ошибкой пространства PermGen

Я пытаюсь запустить команду dbm-gorm-diff из подключаемого модуля миграции базы данных. Однако я всегда сталкиваюсь с java.lang.OutOfMemoryError: PermGen space

Я уже пытался изменить конфигурацию JVM. Это моя текущая конфигурация:

GGTS.ini

-vm
C:/Program Files/Java/jdk1.8.0_20/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20140116-2212
-product
org.springsource.ggts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-vmargs
-Dgrails.console.enable.interactive=false
-Dgrails.console.enable.terminal=false
-Djline.terminal=jline.UnsupportedTerminal
-Dgrails.console.class=grails.build.logging.GrailsEclipseConsole
-Dosgi.requiredJavaVersion=1.6
-Xms512m
-Xmx1024m
-XX:PermSize=1024m
-XX:MaxPermSize=2G
-Dorg.eclipse.swt.browser.IEVersion=10001

BuildConfig.groovy:

grails.project.fork = [
    // configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
    //  compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],

    // configure settings for the test-app JVM, uses the daemon by default
    test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 1024, daemon:true],
    // configure settings for the run-app JVM
    run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 1024, forkReserve:false],
    // configure settings for the run-war JVM
    war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 1024, forkReserve:false],
    // configure settings for the Console UI JVM
    console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 1024]
]

Я не знаю, пропустил ли я файл конфигурации или определенное свойство, которое нужно установить. Может быть, у вас есть совет для меня?

В настоящее время я использую jdk1.7.0_67, ggts 3.6.1 и grails 2.4.2.

--- РЕДАКТИРОВАТЬ ---

возможно, трассировка стека также помогает:

Loading Grails 2.4.2
|Configuring classpath
.
|Environment set to development
...........................................
............
.
Configuring Spring Security Core ...
... finished configuring Spring Security Core
Configuring Spring Security UI ...
... finished configuring Spring Security UI
Configuring Spring Security Core ...
... finished configuring Spring Security Core
Configuring Spring Security UI ...
... finished configuring Spring Security UI
.
|Starting dbm-gorm-diff
Error |
java.lang.OutOfMemoryError: PermGen space
Error |
    at com.sun.org.apache.xalan.internal.xsltc.runtime.output.TransletOutputHandlerFactory.getSerializationHandler(TransletOutputHandlerFactory.java:165)
Error |
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getOutputHandler(TransformerImpl.java:454)
Error |
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:344)
Error |
    at liquibase.util.xml.DefaultXmlWriter.write(DefaultXmlWriter.java:32)
Error |
    at liquibase.serializer.core.xml.XMLChangeLogSerializer.write(XMLChangeLogSerializer.java:106)
Error |
    at grails.plugin.databasemigration.MySQLCompatibleChangeLogSerializer.super$2$write(MySQLCompatibleChangeLogSerializer.groovy)
Error |
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error |
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Error |
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Error |
    at java.lang.reflect.Method.invoke(Method.java:606)
Error |
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
Error |
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
Error |
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1085)
Error |
    at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110)
Error |
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:128)
Error |
    at grails.plugin.databasemigration.MySQLCompatibleChangeLogSerializer.write(MySQLCompatibleChangeLogSerializer.groovy:32)
Error |
    at liquibase.diff.DiffResult.printChangeLog(DiffResult.java:507)
Error |
    at liquibase.diff.DiffResult$printChangeLog$1.call(Unknown Source)
Error |
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
Error |
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
Error |
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
Error |
    at grails.plugin.databasemigration.ScriptUtils.createAndPrintFixedDiff(ScriptUtils.groovy:245)
Error |
    at grails.plugin.databasemigration.ScriptUtils$createAndPrintFixedDiff$1.call(Unknown Source)
Error |
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
Error |
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
Error |
    at DbmGormDiff$_run_closure1_closure2_closure3.doCall(DbmGormDiff:53)
Error |
    at DbmGormDiff$_run_closure1_closure2_closure3.doCall(DbmGormDiff)
Error |
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error |
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Error |
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Error |
    at java.lang.reflect.Method.invoke(Method.java:606)
Error |
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:207)

person gabriel    schedule 12.09.2014    source источник


Ответы (2)


Наконец я понял, в чем проблема. В конце концов, это не было связано с JVM или указанным размером PermGen.

У меня был один класс домена, который выглядел примерно так:

package test

import org.grails.databinding.BindingFormat
import grails.persistence.Entity

@Entity
class TestDomain{

    static constraints = {
    }

}

В классе предметной области свойства не определены. Решение проблемы состояло в том, чтобы удалить только этот класс домена, перезапустить GGTS, а затем снова запустить dbm-generate-gorm или dbm-gorm-diff для проекта (в зависимости от текущего состояния вашего проекта - в моем случае я начал базу данных с нуля и использовал dbm-generate-gorm, но я предполагаю, что это также должно работать в случае dbm-gorm-diff). В итоге команда выполняется без ошибок.

РЕДАКТИРОВАТЬ:

Должен признать, что мое объяснение было неверным.

Оказалось, что и с дополнительным классом домена, содержащим свойства, такая же ошибка возникла в GGTS. Когда я снова удалил файл, он работал правильно. На данный момент я насчитал 35 доменных классов в своем проекте в разных пакетах. Добавление класса домена в любой из пакетов, приводящее к более чем 35 классам домена, приводило к упомянутой ошибке PermGen.

Однако кажется, что это поведение каким-то образом связано с GGTS, потому что, когда я, наконец, попытался запустить команду dbm-generate-gorm-changelog из командной строки, она была не только намного быстрее, чем GGTS, но и преуспела без ошибок.

На данный момент я не могу объяснить, почему это работает в командной строке, а не в GGTS.

Также не было необходимости устанавливать переменную окружения GRAILS_OPTS="-Xmx1G -Xms256m -XX:MaxPermSize=2048m", что я тоже пробовал, но это никак не повлияло на производительность выполнения командной строки.

person gabriel    schedule 01.10.2014

Я нашел еще один хороший способ сделать это. Это обновляет аргументы jvm при запуске dbm-gorm-diff(dbmGormDiff) и dbm-update(dbmUpdate), предполагая там настройки gradle. Просто добавьте это в build.gradle.

'dbmGormDiff' {
    jvmArgs = ["-XX:MaxPermSize=512m","-Xms1G", "-Xmx2G"]
}

'dbmUpdate' {
    jvmArgs = ["-XX:MaxPermSize=512m","-Xms1G", "-Xmx2G"]
 }

Надеюсь, это поможет и другим.

person mannu    schedule 08.04.2016