启动Java应用程序一次并休眠还是重复启动和杀死更好?

Posted

技术标签:

【中文标题】启动Java应用程序一次并休眠还是重复启动和杀死更好?【英文标题】:Is it better to launch a Java app once and sleep or repeat launching and killing? 【发布时间】:2017-07-02 12:08:37 【问题描述】:

我有一个需要多次运行的 Java 应用程序。每次运行时,它都会检查是否有要处理的数据,如果有,则处理数据。

我正在尝试找出执行此操作的最佳方法(性能、资源消耗等):

1.- 启动一次,如果没有要处理的内容,让它休眠(全 Java)。

2.- 使用 bash 脚本启动 Java 应用程序,完成后,休眠(脚本)然后重新启动 Java 应用程序。

我想知道是否最好让 Java 应用程序保持活动(休眠)或每次都重新启动。

【问题讨论】:

视情况而定。算法等需要多长时间,需要多少资源...您是否准备好croning,调度基础设施等...什么是广泛的生态系统,资源应该被锁定(必须与其他资源竞争)等 每种可能性各有利弊...例如启动时间与复杂性。 @JacekCz 你好。目前,它被部署为第二种方法。有几个应用程序(约 30 个)遵循相同的结构(用于启动和重新启动的 Bash 脚本)并使用 cron 来启动它们。每个程序花费的时间取决于要处理的数据量,但可能从几秒到几小时不等。 考虑把你的线程放到wait()而不是sleep()释放你线程的锁,以免因阻塞而浪费资源 您应该知道 cron 并不关心上一次运行是否完成,因此您最好确保没有两个程序实例试图处理相同的输入数据 - 请参阅这里:***.com/questions/14409651/… 【参考方案1】:

如果没有具体的上下文,很难回答您的问题。从表面上看,您的问题听起来可能是premature optimization。

一般来说,我建议你做对你来说更容易做(和维护)的事情,除非你有充分的理由不这样做。以下是一些可能的充分理由,请选择适合您情况的理由:

在 Java 中睡觉:

在 Java 中检查是否有新数据更容易 启动 Java 程序需要时间或其他资源,例如,如果在启动时,您的程序需要加载一堆数据 由于某种原因,从 bash 启动 Java 进程很复杂 - 可能需要您摆弄一堆环境变量、文件或其他东西。

用于从 bash 重新启动 Java 程序:

在 bash 中检查是否有新数据更容易 让 Java 进程进入睡眠状态很复杂 - 也许您的 Java 进程是一个复杂的多线程野兽,停止然后重新启动各个线程很复杂。 您需要 Java 作业之间的内存 - 完全终止 Java 进程将释放其所有内存。

【讨论】:

也是第二种方法的原因:醒来后检查是否一切正常。例如,数据库连接可能已失效等。【参考方案2】:

我不会让它活着。 您可以使用一些按定义的时间间隔运行的作业来代替它,您可以使用 jenkins 或者您可以使用 Windows 调度程序并将其配置为每 5 分钟运行一次(如您所愿)。

Run a batch file with Windows task scheduler

您可以从您的批处理文件中执行以下操作:

javac JavaFileName.java // 编译

java JavaFileName // 执行文件

在这里查看如何从 cmd 执行 java 文件:

How do I run a Java program from the command line on Windows?

【讨论】:

【参考方案3】:

我个人会根据应用程序运行的位置来确定它。

如果它是我的个人计算机,我会使用带有 bash 脚本的第二个选项(因为我本地计算机上的资源可能会发生很大变化,因为大量使用了其他一些程序,并且在某些情况下可能会发生这种情况例如,我可能内存不足) 如果它去云(亚马逊、谷歌等)我确切地知道那里正在运行什么样的进程(与我的本地 PC 相比,它不应该如此动态地改变)并且带有一些调度程序的长时间运行的 java 会对我很好

【讨论】:

以上是关于启动Java应用程序一次并休眠还是重复启动和杀死更好?的主要内容,如果未能解决你的问题,请参考以下文章

写一个杀死Gradle Daemon的shell脚本和bat脚本

休眠:必须重新启动 Java 应用程序才能重新加载数据

JAVA线程启动时间的问题。。。

java线程只能被启动(Thread.start())一次,那么为啥线程池中的线程能被重复利用呢?

Java中的杀死或销毁或退出线程[重复]

使用Java杀死进程