Grails - dbm-gorm-diff运行到PermGen空间错误

时间:2014-09-12 10:22:48

标签: java grails database-migration 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 个答案:

答案 0 :(得分:0)

最后,我弄清楚问题是什么。毕竟,它与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"我也试过但对命令行执行的性能没有任何影响。

答案 1 :(得分:0)

我找到了另一个好方法。这会在运行dbm-gorm-diff(dbmGormDiff)和dbm-update(dbmUpdate)时更新jvm参数,并假设其中有gradle设置。只需将其添加到build.gradle。

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

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

希望它也能帮助别人。