限制Java CPU和内存使用量

时间:2017-06-17 11:47:46

标签: java multithreading memory-management cpu-usage

我想创建一个能够限制每个线程的 CPU 内存用法的Java应用。比方说,它是一个Rest API,在每个请求和响应之间,都有一个进程。我想限制它们。是否可以动态地从代码中执行此操作?

下一个相关的问题是,如果我有分布式计算机,并希望再次为每个进程应用此CPU和内存限制,该怎么办?

也许您可以推荐一些与此高级主题相关的书籍或博客。

谢谢

2 个答案:

答案 0 :(得分:2)

您无法单独在Java层上执行此操作,您需要深入了解虚拟机。

我建议使用像JamVM这样的简单虚拟机的源代码,并尝试构建以理解它。可能是设置限制的可能性比整体性能更重要的情况。

OpenJDK会为您提供相当新的代码库,但显然实现起来要复杂得多。 Cacao可能介于两者之间。

作为替代方案,您可以尝试在并行运行的多个Java虚拟机之间对应用程序进行分区。当然,并非每个应用程序都可以通过这种方式进行分区,但可能是一个专门编写的应用程序。如果要这样,请查找JPPF等现有项目。

答案 1 :(得分:1)

您可以使用JVM(Java虚拟机)参数部分实现 - 您可以为JVM设置线程和堆大小的堆栈大小。但是没有可能为每个线程限制内存。 Is there a way to put maximum memory usage limit on each thread in Java?

也不可能限制CPU使用率Limiting java application's memory and cpu usage

您可以通过Thread类中的setPriority()在Java程序中设置线程优先级 - 但它很糟糕且真的无效。

您还可以将现在线程的东西生成为单独的进程(而不是单独的线程) - 具有固定堆大小和自定义进程优先级(cpu使用率)。但是你必须使多进程通信有效,需要一些知识(不要自己编写,使用一些已经过战斗测试过的消息传递系统)。此解决方案可能需要对您当前的代码进行大量更改。

文字吼叫是个人意见

每当你有应用程序需要通过一些魔术(手动或代码)设置优先级时,应用程序架构有99%的可能性被设计破坏。

但为什么?

那么,让JVM花费数年时间开发最有效的线程管理解决方案的人。您应该承认JVM更了解如何处理它。