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)

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", которую я также пытался, но не оказывал никакого влияния на производительность выполнения командной строки.

Я нашел другой хороший способ сделать это. Это обновляет аргументы 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"]
 }

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

Другие вопросы по тегам