在内存超过给定阈值后暂停所有正在运行的线程

时间:2015-07-09 08:20:22

标签: java multithreading executorservice

我有一个要求,我有一个多线程的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) {
         // ...
    }
}

请建议,需要做出哪些更改,或者是否有其他更好的方法。谢谢。

2 个答案:

答案 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();
}