我想创建一个能够限制每个线程的 CPU 和内存用法的Java应用。比方说,它是一个Rest API,在每个请求和响应之间,都有一个进程。我想限制它们。是否可以动态地从代码中执行此操作?
下一个相关的问题是,如果我有分布式计算机,并希望再次为每个进程应用此CPU和内存限制,该怎么办?
也许您可以推荐一些与此高级主题相关的书籍或博客。
谢谢
答案 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更了解如何处理它。