【问题标题】:Set Max Number of Created Threads for Java application using Linux使用 Linux 为 Java 应用程序设置最大创建线程数
【发布时间】:2015-11-04 06:35:30
【问题描述】:

我正在 Centos 下运行一个 Java 应用程序,并且对您可以设置创建的最大线程数的限制的方法感到好奇。请不要与给定时间的最大线程数混淆。

例如,应用程序每天都会创建和销毁一个线程。在 Linux 设置中是否可以设置只能创建 250 个新线程。然后在第 250 天之前的某个地方(由于创建了其他线程而更早)它会崩溃(抛出异常),因为它已达到创建新线程的允许限制。

【问题讨论】:

  • 您说的是内核级线程还是Java级线程?并非所有Java线程都分配有内核线程。
  • 另外,您遇到了什么具体的例外情况?似乎您必须创建大量线程才能得到这样的错误。您使用的是什么 Java 版本?
  • 我们使用的是 Java 8。问这个问题的原因是我们的生产环境中有一个应用程序开始抛出无法创建新线程运行时错误。我们通过监控得知该应用当时只有 120 个线程。由于我们在测试中从未遇到此错误,因此我试图查看 Linux 环境中的某种设置是否可以创建此错误。我们不断地创建和销毁线程,但从来没有一次运行多个线程。所以内核级线程或Java级线程的设置都适用。
  • 您使用的是哪种 Java 8 实现?可能有一个命令行标志来控制它。
  • 它不是由命令行标志设置的。我敢肯定。 [root@edd ~]# java -version java version "1.8.0_45" Java(TM) SE Runtime Environment (build 1.8.0_45-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode )

标签: java linux multithreading


【解决方案1】:

你可以自己制作ThreadFactory,比如

public class LimitedThreadFactory implements ThreadFactory {

    public LimitedThreadFactory(final int limit) {
        this.limit = limit;
    }

    public Thread newThread(final Runnable runnable) {
        if (numberOfThreadsCreated >= limit) {
            // exit gracefully
        }
        // create the thread, maybe with new Thread(runnable);
        numberOfThreadsCreated++;
    }

    private final int limit;
    private int numberOfThreadsCreated;
}

【讨论】:

  • 对于我的具体情况,我很好奇如何在 Linux 环境中进行设置。
  • 我想你可以将它作为 java 命令行参数传递。 -Dyour.program.threadlimit=250,然后将新的ThreadFactory 传递给创建线程的对象。
  • Thread.getId() 是线程数的计数。当你到达getId() > 250时你可以停下来
【解决方案2】:

Linux 只强制使用资源,而不是曾经使用过的资源(除了总 CPU 消耗)

您可以在 Linux 中通过添加 endorsed 库来定义您自己的 ThreadGroupThread 类来执行此操作。这可以添加到 JVM 中,这样您就不需要更改应用程序,并且它可以使用环境变量来设置限制。

这仍然需要一些预先编码,但 JDK 是一个开发环境。

【讨论】:

  • 好的,这备份了我编写的一些简单程序以进行测试以及我从互联网上研究收集到的内容。我只是找不到任何地方明确指出 Linux 不强制执行“曾经使用过的资源”。
  • @DavidR 如果他们这么说,他们以后就不能提供这个了。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2020-11-02
  • 2012-06-16
  • 2010-09-13
  • 1970-01-01
  • 2011-01-26
  • 2012-02-11
相关资源
最近更新 更多