【发布时间】:2010-11-15 04:32:26
【问题描述】:
我正在编写一个将运行多个线程的应用程序,并且想要限制这些线程的 CPU/内存使用率。
有一个similar question for C++,但我想尽可能避免使用 C++ 和 JNI。我意识到使用更高级别的语言可能无法做到这一点,但我很想知道是否有人有任何想法。
编辑:添加了赏金;我想要一些非常好的、经过深思熟虑的想法。
编辑 2: 我需要这个的情况是在我的服务器上执行其他人的代码。基本上它是完全任意的代码,唯一的保证是类文件上会有一个 main 方法。目前,在运行时加载的多个完全不同的类作为单独的线程同时执行。
按照它的编写方式,重构为每个执行的类创建单独的进程会很痛苦。如果这是通过 VM 参数限制内存使用的唯一好方法,那就这样吧。但我想知道是否有办法用线程来做到这一点。即使作为一个单独的进程,我也希望能够以某种方式限制它的 CPU 使用率,因为正如我之前提到的,其中几个将同时执行。我不希望无限循环占用所有资源。
编辑 3: 近似对象大小的一种简单方法是使用 java 的 Instrumentation 类;具体来说,getObjectSize 方法。请注意,使用此工具需要进行一些特殊设置。
【问题讨论】:
-
你使用什么线程模型? Java 任务执行器?
-
另外,您在这个应用程序中的瓶颈在哪里?数据库? IO?
-
我唯一能想到你想要限制 CPU 的地方是电池寿命是否是一个问题(然后你的问题就变成了,当我在做计算昂贵的事情时,我如何发现电池受限的设备?)。否则,为什么要让用户等待比他们需要的时间更长呢?如果您想保持系统响应能力,请使用低线程优先级,而不是尝试限制 CPU 使用率。
-
@nemo 在这种情况下,瓶颈只是你可以塞进运行应用程序的服务器的内存量和 CPU 能力。正如我上面提到的,陷入无限循环的线程将占用大量资源,而其他线程则任其摆布。真的很难判断某些东西是否处于无限循环中,或者它是否合法地占用大量处理器。无论哪种方式,我都不希望一两个线程占用所有资源。我希望它尽可能并行化,以便较小的不太密集的线程可以快速完成。
-
@nemo 它正在使用 Thread 对象。构造函数接受在运行时加载的类,并使用反射在该类上执行 main 方法。
标签: java memory multithreading cpu throttling