使用Nailgun加速Clojure的启动时间

11

偶尔我想在Shell脚本中使用clojure,但启动时间约为900毫秒实在是太慢了。于是我会 startpage 搜索“nailgun clojure”,但只有vimclojure之类的特殊情况才会显示出来。这时,我装作没有时间,转向启动更快的更awkward语言。

那么,如何使用nailgun来加速clojure的启动时间呢?

1个回答

22

Debian

执行以下步骤:

apt-get install nailgun                          # install nailgun
java -server -jar /usr/share/java/nailgun.jar&   # run nailgun server
ng-nailgun ng-cp /usr/share/java/clojure-1.4.jar # add clj to classpath

现在服务器已经运行且配置完毕,您可以在其上运行Clojure脚本:

ng-nailgun clojure.main path/to/myscript.clj

就我的情况而言,与没有使用Nailgun相比,实际脚本的启动时间缩短到了80毫秒。

为了使实际脚本的运行更加方便,创建一个可执行文件ng-clojure,其中包含以下内容,并将其放在路径中的某个位置:

ng-nailgun clojure.main "$@"

在你的 Clojure shell脚本 中,将以下内容作为第一行添加:

#!/usr/bin/env ng-clojure

然后将Clojure shell脚本设为可执行,再像这样运行它:

path/to/myscript.clj

OSX

brew install nailgun
ng-server 
ng ng-cp ~/.m2/repository/org/clojure/clojure/1.5.1/clojure-1.5.1.jar 

然后按照上面的方法执行您的脚本。

更新: 使用一段时间后,它似乎并不完美。有时会出现随机错误,而在没有使用nailgun时不会发生这些错误,有时似乎存在内存泄漏,使得nailgun JVM随着时间推移消耗所有内存,最终导致系统交换到磁盘。尚未对此进行内存分析,但希望提醒您。


太棒了!有人应该在Planet Clojure博客上分享这个。 - mike3996
当尝试在一个Java服务器上运行不同的东西时,是否会遇到代码冲突的问题?或者我理解错了什么? - rvirding
@rvirding 我不确定你所说的“代码冲突”是什么意思,但如果这不能100%正常工作,我也不会感到惊讶。例如,可能存在静态全局状态等问题。 - Evgeniy Berezovsky
内存泄漏的可能原因是Clojure将在运行时生成许多新类,而jvm的垃圾回收器在清理permgen /垃圾类方面没有处理普通数据那样熟练。 - noisesmith
@noisesmith 这已经是一段时间以前的事情了,但如果在nailgun的生命周期内我创建了相当于几个GB的类文件(无论是否进行垃圾回收),我会感到惊讶。 - Evgeniy Berezovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接