【问题标题】:Infinite while loop : Java or Shell script无限while循环:Java或Shell脚本
【发布时间】:2017-01-05 07:29:26
【问题描述】:

我想通过 shell 脚本无限次执行 Java 代码。为此,我有两个选项。

  1. 使用 while 循环在 Shell 脚本中无限调用 Java 类
  2. Java 类代码中的无限 while 循环并在 Shell 脚本中调用 Java 类一次

哪种方法更好?

【问题讨论】:

  • 你自己没有意见吗?
  • 使用java,您可以通过将这些命令写入文件来跟踪执行的命令,这可能对以后的调试有所帮助
  • 视情况而定。在所有其他条件相同的情况下(它们从来都不是),我认为没有必要每次都返回 shell 并再次调用 Java,所以 Java 中的循环一开始似乎最有吸引力。
  • 目的是什么?不知道目标很难回答。
  • @ShreyankShah 感谢您的接受;但是阅读您最新的 cmets,我有点惊讶:当您真的外出进行 24x7 实时事务处理时;那么应该有一个完整的架构;以及关于如何准确地部署/运行该组件应该是该思考过程中的重要“章节”的想法。从这个意义上说,仅仅提出一个关于 SO 的问题只是一个开始。是的,这给了你一些想法;但真正的思考应该现在才开始......

标签: java linux shell


【解决方案1】:

基于技术事实的答案:

在你的 shell 脚本中有循环意味着你不断地启动新的 JVM 进程。与您正在执行的 Java 程序中存在循环相比,这会给您的系统带来更高的负载。

换句话说:你启动一个 JVM 会话,它会做一些事情;它下降了;下一个开始......永远。

Linux 可能在幕后做了很多事情来降低这样做的成本(例如,实际上将内容保存在内存中);但仍然:您不断启动流程以在此后不久结束它们。

如果您真的打算“无限”地运行您的代码;比你绝对想避免以任何形式浪费资源。

另一方面,可以提供一个(弱)论据来将循环保持在脚本端:当您将循环放入 java 代码中时,您的 java 代码实际上是错误的(例如内存泄漏);那么那个 JVM 的内存消耗可能会永远增长(直到达到其极限;然后您可能会看到大量垃圾收集)。

含义:当你知道你的 Java 代码状况不佳时;并且在 same JVM 中长时间运行它会导致问题;那么当然:启动和停止 JVM 有一些好处。 但是当然 - 在那种情况下,无论如何你都会遇到更大的问题。如果您的 java 应用程序有这样的问题,那么您最好找出它们的根本原因并修复它们;而不是不断启动/停止 JVM 来规避这些问题。

【讨论】:

  • 感谢您的回答。但我有一个问题。一段时间后它会影响内存(RAM)问题吗?
  • 您的意思是当您将循环保留在脚本中时?不,我不这么认为。
  • 我相应地更新了我的问题。一般来说:当你写下你的代码时,你的应用程序(和 JVM)的内存消耗应该是稳定的。但是当然,如​​果你做得不好,那么保持 JVM 运行可能会导致有趣的问题;这是真的。
  • 我感觉您大大低估了以 24x7 模式运行复杂 Java 应用程序背后的复杂性。答案是:这真的取决于!如果您创建了完美的 Java 代码,那么它遵循良好“记忆”行为的所有规则;然后调用 System.gc() 应该不会有太大的不同。如果你放了很多 cp;那么 System.gc() 可能会有所帮助;或者它可能不会。长话短说:这里的人**不可能告诉你应该做什么。
  • 您必须真正了解您的应用程序的行为(例如通过进行广泛分析)。有无数种方法可以影响 Java GC 的工作方式;并且没有绕道:您需要了解自己在做什么!
【解决方案2】:

如果您不关心间隔,使用“watch”命令怎么样?
您可以输入
观看{你的命令}
然后你的命令会刷新 2 秒,如果你想改变间隔,你可以输入
watch -n 5 {你的命令}
然后间隔为 5 秒,如果您正在监视某个输出值,这很方便。要退出,您可以使用 CTRL+C。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多