【问题标题】:limiting number of threads used by the JVM限制 JVM 使用的线程数
【发布时间】:2013-06-24 21:06:51
【问题描述】:

如何限制某人可以创建的线程数?我所做的是运行某人的代码(类似于 ideone),并希望限制他可以生成的线程数。怎么做?一些 jvm 设置或其他什么?

编辑 我添加了更多指定的信息,因为有些人不明白我的意思。

  1. 某个随机的人向我发送了我的计算机将要执行的代码
  2. 代码必须在使用最多 k 个线程的情况下执行
  3. 一切都必须自动化 - 像 SPOJ、ideone 等一样工作。

【问题讨论】:

  • java 字节码注入器可能吗?像 java-profiler 一样,但添加东西而不是检查。您可以在启动之前限制 jvm 内存空间,但它的值不准确,可以是 1000 或 10000,线程大小也很重要。限制内存空间也可能产生相反的效果。
  • 使用线程池,有限制
  • @BobFlannigon 这不是我的代码。我的机器只会运行它,我想要的是禁止启动新线程。例如,如果有人生成 Thread,它甚至会崩溃,但无论如何它都无法执行。该怎么做?

标签: java linux multithreading jvm


【解决方案1】:

在 Linux 上,您可以作为单独的用户运行程序并使用 shell 命令ulimit -u nprocs 来限制该用户的线程(进程)数。如果尝试超过限制,the JVM will throw an OutOfMemoryError

但是你为什么要这样做呢?您是否担心程序会消耗计算机的所有 CPU 资源?如果是这样,您可能需要考虑以较低的调度优先级运行 JVM,使用 nice,以便其他进程优先使用 CPU:

 NPROCS=100 # for example
 NICENESS=13 # for example
 ulimit -u $NPROCS
 nice -n $NICENESS java ...

以这种方式使用nice应该降低所有线程的优先级,但是it is not clear that it does so for Linux

【讨论】:

  • 事实上,我会尝试编写类似 SPOJ 的系统,当有人尝试使用 pthread 创建线程或恶魔(可以追踪 fork 等)时,在 C/C++ 中很容易找到它。我认为java线程与物理线程无关。这就是为什么询问一些jvm设置的原因。投票赞成。关于 cpu 资源我将使用 cpulimit。您可以在 % 中设置进程可以使用的时间
【解决方案2】:

您可以为在构造函数或 start 方法中执行所需检查的线程创建自己的子类。

为确保您正在运行的代码使用您的自定义线程类,您必须使用您自己的自定义类加载器加载代码,并且该类加载器只会捕获对 java.lang.Thread 类的任何请求并分发 您的自定义 类(这个概念也可以扩展到其他类)。

警告:实施这不是微不足道的。

【讨论】:

  • 对我提出的问题提出了很好的想法,所以也投了赞成票,但不会使用它,它更特定于语言,这实际上是我的错 - 我的问题是 java 特定的:)
【解决方案3】:

AFAIK,Limit 完全取决于操作系统而不是 JVM。

您可以通过Executor service 监控它们

一个 Executor,提供管理终止的方法和可以生成 Future 以跟踪一个或多个异步任务的进度的方法。

ExecutorService pool = Executors.newFixedThreadPool(n);

【讨论】:

  • 如果不是我的代码并且有些可以使用扩展线程,ExecutorService 如何帮助我?仅限于此池中的线程,但它不会阻止某人创建其他池或只是扩展线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多