【问题标题】:Groovy shell horrendously slow to startGroovy shell 启动速度非常慢
【发布时间】:2014-12-01 20:13:00
【问题描述】:

我正在运行交互式 Groovy Shell,它确实需要 分钟 在我的机器上启动(一台配备 Intel i5 处理器和 4 GB RAM 的 Windows 7 笔记本电脑,而不是一台老式电脑,就在路中间一)

使用groovygroovyclientgroovyserver 运行简单脚本需要可接受的时间(最多几秒),但在运行groovysh 之后,光标开始闪烁......喝茶,写下这个问题,然后在 Twitter 上吐槽(仍然没有提示编写任何代码)

尝试了以下配置

  • Groovy 版本:2.3.4 JVM:1.7.0_03 供应商:Oracle Corporation 操作系统:Windows 7
  • Groovy 版本:2.3.4 JVM:1.8.0_20 供应商:Oracle Corporation 操作系统:Windows 7

而且完全一样。

我真的很希望能够以 REPL 风格使用它。有没有人遇到并解决过类似的问题?你能推荐一个不同的工具来完成这项工作吗?

按照 cmets 中的建议,我运行 groovysh -d -v 以启用调试和详细输出,希望看到需要这么长时间。

groovysh -d -v 的输出

DEBUG [org.codehaus.groovy.tools.shell.BufferManager] Created new buffer with index: 0
DEBUG [org.codehaus.groovy.tools.shell.BufferManager] Buffers reset
DEBUG [org.codehaus.groovy.tools.shell.Parser] Using parser flavor: rigid
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: ?
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :help
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :quit
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :exit
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: import
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :display
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :clear
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :show
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :inspect
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :purge
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :edit
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: .
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :load
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :save
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :record
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :history
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :alias
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :set
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :register
DEBUG [org.codehaus.groovy.tools.shell.CommandRegistry] Registered command: :doc

很长一段时间,没有进一步的输出,然后在几秒钟内全部休息:

DEBUG [org.codehaus.groovy.tools.shell.Groovysh] Terminal (jline.AnsiWindowsTerminal@66f57048)
DEBUG [org.codehaus.groovy.tools.shell.Groovysh]     Supported:  true
DEBUG [org.codehaus.groovy.tools.shell.Groovysh]     ECHO:       (enabled: false)
DEBUG [org.codehaus.groovy.tools.shell.Groovysh]     H x W:      41 x 169
DEBUG [org.codehaus.groovy.tools.shell.Groovysh]     ANSI:       true
DEBUG [org.codehaus.groovy.tools.shell.Groovysh]     Direct:     true
DEBUG [org.codehaus.groovy.tools.shell.InteractiveShellRunner] Using history file: C:\Users\Tomek\.groovy\groovysh.history
Groovy Shell (2.3.4, JVM: 1.8.0_20)
Type ':help' or ':h' for help.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[1] for command: :help
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[2] for command: ?
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[3] for command: :exit
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[4] for command: :quit
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[5] for command: import
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[6] for command: :display
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[7] for command: :clear
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[8] for command: :show
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[9] for command: :inspect
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[10] for command: :purge
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[11] for command: :edit
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[12] for command: :load
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[13] for command: .
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[14] for command: :save
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[15] for command: :record
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[16] for command: :history
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[17] for command: :alias
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[18] for command: :set
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[19] for command: :register
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Added completer[20] for command: :doc
DEBUG [org.codehaus.groovy.tools.shell.CommandsMultiCompleter] Refreshing the completer list
DEBUG [org.codehaus.groovy.tools.shell.InteractiveShellRunner] Running
groovy:000>

【问题讨论】:

  • -vd开头有什么线索吗?
  • 运行 groovysh -vd 导致以下错误:"Unrecognized option: -vd error: jvm creation failed with code -1: unknown error"
  • 只是-d?检查帮助。也许它的/d 或其他一些windowizm
  • @cfrick 更新了输出,现在使用-d -v 运行,如果输出有任何有意义的不同,我会发布。

标签: performance groovy windows-7 groovyshell


【解决方案1】:

7 年后……好吧,这里有另一个答案建议。我有一个类似的问题并调查发现在启动时,groovysh 尝试通过调用PackageHelperImpl 来解析类。这里的问题是它递归地扫描所有子目录。因此,groovysh 启动速度极慢的一个原因是您在尝试启动它的位置下有一个巨大的文件层次结构。要对此进行测试,请尝试在没有子目录的文件夹中以完全相同的方式启动它。

【讨论】:

    【解决方案2】:

    它可能是内存,确保没有 Java 应用程序首先运行(当 2 个 Java 应用程序在 Windows 中争夺内存时,Java 的表现非常糟糕——这完全是系统杀手),但如果是这样的话,我会觉得很时髦加载也会很慢。

    另一种可能性是您的系统可能无法加载 JLine dll。要测试此尝试:

    Groovysh --terminal=false
    

    它将避免加载 JLine - 如果没有 JLine,您将无法进行 up/down/tab 处理,因此您不想以这种方式运行,但如果您知道这是您的问题,您应该很容易找到网上的东西告诉你如何解决它。

    【讨论】:

    • 我确实尝试杀死除控制台之外的所有内容。此外,我使用的许多工具,包括 IDE 和服务器都是 Java 应用程序,所以我根本无法避免它们。运行Groovysh -console=false 产生Unrecognized option: -console=falseGroovysh --console=false 也是如此。这看起来像一个变量,所以我也尝试了Groovysh -Dconsole=false,这次 Groovysh 运行了,但启动时间和以前一样。
    • 我想我会尝试使用可视 VM 分析控制台,也许它会告诉我正在发生的事情。最后的手段是从源代码构建它并进行调试。但我需要一些空闲时间来做到这一点。幸运的是,这对我来说并不是什么大问题,因为我可以很好地运行窗口 GroovyConsole。
    • @toniedzwiedz 真的很抱歉,我是凭记忆说的,但弄错了。尝试“--terminal=false”或“--terminal=null”(这次测试了!)我相信它们的意思是一样的,两者都应该禁用JLine。答案已相应更新。
    • 感谢您的更新。这次它实际上运行了控制台,但不幸的是它仍然需要几分钟才能启动。
    • 我刚刚做了一个快速测试。 "groovy -e 'while(true);'正如进程管理器报告的那样,运行需要 65mb,groovysh 从 126 开始并迅速达到 167mb。如果您有其他 Java 应用程序正在运行,那么内存可能是一个因素。当 groovy 启动时,Windows 的行为是否非常缓慢?您的其他 Java 应用程序是否响应?如果 groovysh 在任何其他 Java 应用程序之前运行,它是更好还是相同?
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2012-11-05
    相关资源
    最近更新 更多