我有一个要求,我有一个多线程的java应用程序,我想监视应用程序中的内存使用情况。一旦内存超过90%,我想暂停执行程序服务中所有正在运行的线程。下面是一个示例代码,我写了,但是,我不确定,如何暂停线程。我正在尝试每分钟轮询以检查内存利用率,但不确定如何暂停执行程序服务中的所有线程。
@Controller
@RequestMapping(value = "/grid")
public class GridController {
@RequestMapping(method = RequestMethod.GET)
public String get(Model model) {
// ...
}
@RequestMapping(value = "/{objType}", method = RequestMethod.GET)
public String displayGrid(Model model, @PathVariable("objType") String objType) {
// ...
}
@ResponseBody
@RequestMapping(value = "/loadGrid", method = RequestMethod.GET)
public String loadGrid(Model model) {
// ...
}
}
请建议,需要做出哪些更改,或者是否有其他更好的方法。谢谢。
答案 0 :(得分:1)
您可以使用ReentrantLock
,如以下示例所示。您的Worker
个帖子需要偶尔调用check()
方法
public class MemoryAwait {
private Lock lock = new ReentrantLock();
private Condition memoryAvailable = lock.newCondition();
public MemoryAwait() {
ScheduledExecutorService schedule = (ScheduledExecutorService) Executors.newSingleThreadExecutor();
schedule.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (enoughFreeMemory()) {
memoryAvailable.notify();
}
}
}, 0, 60, TimeUnit.SECONDS);
}
public void check() throws InterruptedException {
try {
lock.lock();
while (!enoughFreeMemory()) {
memoryAvailable.await();
}
} finally {
lock.unlock();
}
}
private boolean enoughFreeMemory() {
Runtime runtime = Runtime.getRuntime();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
return allocatedMemory / maxMemory < 0.9;
}
}
答案 1 :(得分:0)
我不知道如何监控堆使用情况,但是......
...你说“暂停”就像是一个线程要对另一个人做的事情。
糟糕的主意。
如果你是一个线程,并且你正在占用所有的记忆,那么如果我能“暂停”你会有什么好处呢?当你“暂停”时,如何释放你正在使用的任何内存?
你想要的是每个工作者线程做这样的事情:
while (true) {
waitUntilTheresEnoughAvailableResources();
acquireSomeResources();
doAUnitOfWorkWork();
freeResources();
}