启动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脚本