控制Linux中Java独立运行的最大值

控制Linux中Java独立运行的最大值,java,memory-management,process,Java,Memory Management,Process,我们开发了一个Java独立程序。我们已经在Linux(RedHat ES 4)cron中进行了配置 计划每10分钟执行一次Java单机版。每个独立的 有时可能需要超过1小时才能完成,或者有时可能需要完成 甚至在5分钟之内 我要寻找的问题/解决方案是,执行Java Standalone的数量 例如,任何时候都不应超过5个过程。那么比如说,, 在Java独立/进程启动之前,如果已经有5个进程在运行, 那么这个过程就不应该开始了,;否则,这将间接启动 正在创建OutOfMemoryError问题。我如

我们开发了一个Java独立程序。我们已经在Linux(RedHat ES 4)cron中进行了配置 计划每10分钟执行一次Java单机版。每个独立的 有时可能需要超过1小时才能完成,或者有时可能需要完成 甚至在5分钟之内

我要寻找的问题/解决方案是,执行Java Standalone的数量 例如,任何时候都不应超过5个过程。那么比如说,, 在Java独立/进程启动之前,如果已经有5个进程在运行, 那么这个过程就不应该开始了,;否则,这将间接启动 正在创建OutOfMemoryError问题。我如何控制这个?我还想使这5个进程限制可配置

其他信息:
我还配置了-Xms-Xmx堆大小设置

是否有任何工具/机制可以控制这一点


我还听说了。这是怎么回事?

您可以创建5个空文件(名称为“1.lock”、…、“5.lock”),并使应用程序锁定其中一个文件以执行(或在所有文件都已锁定的情况下退出)。

首先,我假设您可以交替使用“线程”和“进程”这两个词。两个想法:

  • 让cron作业成为一个脚本,用于检查当前正在运行的进程并对其进行计数。若小于阈值,则生成新进程,否则退出,在此可以在脚本中定义阈值
  • 让正在执行的java文件中的main方法检查一些外部资源(文件、数据库表等)中运行的进程数,如果它低于阈值increment并启动进程,否则退出(这是假设简单的main方法不足以导致OOME问题)。您可能还需要在外部资源上使用适当的锁定机制(尽管如果您的作业是每10分钟一次,这可能会有些过分),在这里您可以在.properties或其他一些程序配置文件中定义阈值

  • 帮助您将java程序设置为Windows服务或*nix守护进程。它并没有真正解决您所看到的并发问题——最接近的是一个配置设置,如果它是Windows服务,则不允许并发实例。

    +1。您可能还需要某种类型的系统来处理所有锁都被锁上而无法再进行工作的情况。还是什么都不做就可以了?当你说“…应用程序锁定…”时,我如何锁定它?你能和我分享一下你关于锁定的想法/方法吗?
    http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#lock(long,long,boolean)
    。您可以通过调用
    http://java.sun.com/javase/6/docs/api/java/io/FileInputStream.html#getChannel()
    。您好,我编写了一个小Java程序来测试这个,但是在运行时我得到了NonWritableChannelException。我在Windows机器上运行这个。String file1=“E:\\Java\\1.lock”;FileInputStream fis1=新的FileInputStream(file1);FileChannel fc1=fis1.getChannel();//fc1.lock(0,1,false);fc1.lock();为了能够打开用于写入的通道,您应该构造一个FileOutputStream并对其调用.getChannel()。阅读FileChannel摘要javadoc中倒数第二段。嗨,Jessup,你说得对。我交替使用了这两个词。我用“我也听说过Java Service Wrapper。这是怎么回事?”再次编辑了这个问题。对此有什么想法/评论吗?@jessup您有没有简单的cron作业脚本来检查当前运行的所有进程?我不是Linux schell脚本方面的专家。或者,给我一些关于这个的链接,-Xms和-Xmx用于配置JVM堆大小,而不是为给定JVM配置足够的heap->OutOfMemoryError。您的程序的每个实例都将在其自己的JVM(进程)中运行,因此,除非一个正在运行的程序影响另一个正在运行的程序的负载,否则运行程序的数量与OutOfMemoryError之间不应有任何关联。。。