【问题标题】:Grails - dbm-gorm-diff running into PermGen space errorGrails - dbm-gorm-diff 运行到 PermGen 空间错误
【发布时间】:2014-11-06 12:04:12
【问题描述】:

我正在尝试从正在运行的数据库迁移插件中获取 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)

【问题讨论】:

    标签: java grails database-migration permgen


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我找到了另一种好方法。这会在运行 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"]
       }
      

      希望它也能帮助其他人。

      【讨论】:

        猜你喜欢
        • 2013-09-03
        • 2012-05-06
        • 2014-12-12
        • 2014-07-01
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        • 2015-03-15
        相关资源
        最近更新 更多