Grails 启动很慢
Posted
技术标签:
【中文标题】Grails 启动很慢【英文标题】:Grails startup is slow 【发布时间】:2010-12-25 15:53:17 【问题描述】:帮助!我正在将一个大型 ruby 应用程序移植到 Grails - 但我的应用程序的 Grails 启动需要 2 分钟以上。
我已经将 dbCreate 设置为“读取”我已经确保我的高端双处理器桌面 windows 框为 Grails 提供所需的 RAM (1 Gig)。我没有安装插件。我有 170 个曾经是 ruby 类的域类。
当它启动时,它会打印出“Running Grails App..”这一行,然后挂起很长时间,然后才打印出“Server running”这一行。
我刚刚做了一些事情,将我所有的 id 迁移到 bigints。这似乎使问题更加严重。现在启动大约需要 10 分钟。
我是 grails 的新手,能否请您详细说明一下在启动时记录事件的内容和位置?至于对 vm 进行分析,我已经有几年没有做很多 Java 了。您推荐什么作为现在使用的最佳分析工具?
我还能做些什么来加快 Grails 的启动速度?
【问题讨论】:
【参考方案1】:不幸的是,我不确定除了你已经做过的事情之外还能做太多事情。如您所知,启动时会发生很多事情,包括所有插件解析/加载、向域对象添加动态方法以及 Groovy 的整体动态特性。
我不确定您使用的是哪个版本,但我已经要求在 1.2 中启动时关闭依赖性检查,因为这也会增加启动时间。
我意识到上述内容并没有太大帮助,所以可能是这样:我将我的应用程序拆分为几个插件。一个用于域对象,一个用于绘图功能,一个用于 excel 导入,另一个用于我需要的一些 UI 结构。我没有这样做只是因为启动时间很慢,但好处是我可以在将所有内容集成在一起之前单独测试系统的各个部分。
我即将添加一个涉及至少 10 个新域对象的新功能,我首先在一个单独的插件中开发它们,方法是为它们必须与核心应用程序交互的少数对象设置存根。这让我既可以减少启动时间,也可以更好地隔离我的代码。
因此,如果您可以选择,请尝试将事物分开,以便您可以单独处理它们,这将在一定程度上缓解您的问题。在让您的团队单独处理较小的组件、更好的模块化等方面可能还有其他好处。
希望这会有所帮助。
【讨论】:
【参考方案2】:170 个域类是相当大的,但 2 分钟对我来说仍然很长。您是否安装了大量插件?可能过于冗长的调试设置?
我很好奇如果你创建一个新的 grails 应用程序需要多长时间,复制到你的所有域对象(以及域对象可能需要实际操作的插件子集),然后看看这需要多长时间开始。
Jean 关于尽可能将事物分开的建议是一个很好的建议。我在以前的项目中做过类似的事情,我们有一个域插件,而我们的其他应用程序都依赖于该域插件。
您还可以使用grails events 在启动时记录一些时间信息,以查看您的瓶颈在哪里。 “PluginInstalled”事件的时机应该很好,因为我认为除了其他插件之外,休眠插件也会被它捕获。
【讨论】:
【参考方案3】:您可能有依赖问题。如果您使用的插件依赖于 maven 中具有“开放式”依赖项的库,则 grails 将每次查看该范围内是否有更新的版本可供下载。我不知道为什么有人会这样指定它。似乎它会导致不可靠的行为。对我来说,罪魁祸首是亚马逊的 java aws 库,它自然会被与亚马逊云对话的插件使用。
http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.2.10
注意它的一些依赖是这样的
org.apache.httpcomponents httpclient [4.1, 5.0)
似乎每次 grails 都在寻找更新的版本(如果存在就下载,我只是注意到这次运行时 httpclient 的 4.2-alpha1 下降了)。
通过从插件中删除该依赖项并将所需的库手动添加到我的 .lib 文件夹中,我将启动时间从 >30 秒减少到
【讨论】:
【参考方案4】:您可能想看看除了 Grails 是否还有其他可以转动的旋钮来解决此问题。
您是否尝试过将此作为性能问题来处理?您可以查看盒子的性能并尝试找出瓶颈所在。是CPU吗?是磁盘读取问题吗?您能否将分析器附加到 VM 并找出占用您大部分启动时间的原因?
【讨论】:
【参考方案5】:您是否尝试过像这些基础知识以进一步部署到您选择的 servlet 容器或就地 .war 引导?
grails -Ddisable.auto.recompile=true run-app
grails run-war
grails war
【讨论】:
以上是关于Grails 启动很慢的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Postgres DB 启动 Grails 3.3.8 应用程序