为什么在Bash上使用Groovy shell脚本(当内存占用很重要时)?

Dav*_*rks 6 linux bash groovy

我有一个Bash脚本(50行代码),由于bash的限制,需要一些黑客攻击.所以有人说:"嘿,使用比bash更好的语言!"

所以,我看了一下Groovy(Groovy/Grails是我的学习列表中的下一个,所以也许这是个好时机).我可以做更复杂的shell脚本,所以这可能是一个完美的选择.

但是,当我运行一个简单的Groovy脚本(while(true){...})时,Java进程的内存消耗为123M,哎哟,我已经有大约10个这样的脚本可以运行(现在基于所有bash)在一个650M内存的盒子上.等效的独立bash脚本在大约1.5M的内存中运行.

这是一个例子:

  • 我是新手做错了什么,123M的内存占用是不是必要的?
  • Groovy不适合这里?也许Python或Perl更有记忆意识?
  • bash是一个很好的选择,即使它的缺点,当一个小的足迹是重要的?

Joa*_*uer 10

如果内存受此限制,那么在JVM上运行的任何语言都将处于劣势.而Groovy就是这样一种语言.

其他语言如Python或Perl具有更精简的运行时并且对于简单的脚本需要更少的内存(我的猜测是Python仍然比Perl更精简,但我不能用数字来支持它).

在我看来,Python是一个很好的升级bash脚本,提供更好的功能,同时仍然足够精简,可以在常见的脚本中使用.

bash本身是一种很好的脚本语言,具有合理的内存要求.如果内存占用非常重要,那么另一个符合POSIX标准的shell(例如破折号)可能是合理的替代品.请注意,bash现代POSIX兼容的Shell中存在许多但不是所有功能.

  • 我还将Ruby添加到列表中.我喜欢Python,但有些东西(调用shell命令和解析输出,正则表达式)比必要的更难.Ruby,otoh,是一个更具可读性的Perl,这使得它对于小型sysadmin脚本来说非常棒. (2认同)
  • 我没有任何使用 Ruby 的经验,但看到它被描述为“更具可读性的 Perl”**真的**让我想学习它! (2认同)

小智 9

这是一个公式:

  • 将Bash用于仅仅戳戳其他程序的脚本.
  • 除非你把自己看成是一个古老的顽固黑客,否则请避免使用Perl.
  • 使用Python或Ruby作为自动执行轻量级任务的脚本.
  • 将Groovy或Scala用于自动执行繁重任务的脚本.

Groovy和Scala对于琐碎的任务来说太过分了,但对推土机情况来说是天赐之物 - 严肃的脚本使得JVM看起来非常节俭.


Ray*_*oal 7

当您启动并在JVM上运行的应用程序时,您应该能够配置应该影响内存占用的堆大小和permgen空间等内容.如果您需要使用Java或Groovy或Jython或JRuby或Scala编写,那么请查看如何为您的应用程序设置它.

是的,基于JVM的语言以消耗内存而闻名,例如对象的8字节开销以及填充需要使得Integer对象需要比你想象的更多的内存(在某处查看:-)).但是,JVM提供了很多的优势:大多数JVM已经通过真正聪明的人的高度调整和优化在过去的15年(你可以写一个垃圾收集器好?).Java平台非常庞大.它拥有一切.

您的10个脚本是否长时间运行并且需要同时驻留内存?还是他们快跑?既然你已经用Bash编写了它们,那听起来你不需要丰富的Java平台.你只是移动文件,切割和捣蛋,唤醒和sedding?

根据经验,我喜欢Bash的小脚本,但是一旦我达到了一个循环或两个循环和几个变量(基本上任何涉及除if语句之外的逻辑),Ruby和Python开始看起来那么多更易于阅读和维护.Groovy不一定是一个糟糕的选择(虽然其他语言更受欢迎).但就内存占用问题而言,您应该花时间尝试调整基于JVM的应用程序并进行一些测量.在你的情况下,它可能并不重要.也许JVM启动时间起了作用?很大程度上取决于您的具体情况.