Tôi có một số lượng lớn các tác vụ cần thực hiện với multithreading
.Cách quản lý bộ nhớ khi sử dụng ExecutorService?
Tôi sử dụng số ExecutorService
để gửi rất nhiều Callable objects
và mỗi Callable object
chứa một số resource
cần thiết để thực thi.
Vấn đề
Những nhiệm vụ này rất nhiều rằng Callable objects
trình ExecutorService
chiếm quá nhiều bộ nhớ thì heap
đang cạn kiệt.
Tôi muốn biết, khi nào thì JVM
giải phóng dung lượng cho các Callable objects
này?
Làm điều này ngay lập tức sau khi công việc được thực hiện và làm thế nào tôi có thể quản lý bộ nhớ được sử dụng cho ExecutorService
?
Tôi muốn kiểm soát việc gửi đến ExecutorService
, ví dụ: khi bộ nhớ không đủ thì chặn việc gửi sẽ sử dụng một số tác vụ đã hoàn thành và dung lượng trống. Có thể nó?
Toàn bộ mã quá compliticated, tôi sẽ đính kèm khung chính của mã của tôi.
public class MyCallable implements Callable<Result> {
... // Some members
public MyCallable(...) {
...
}
@Override
public Result call() throws Exception {
... // Doing the task
}
}
class MyFutureTask extends FutureTask<Result> {
... // Some members
public MyFutureTask(...) {
super(new MyCallable(...));
}
@Override
public void done() {
Result result = get();
... // Something to do immediately after the task is done
}
}
// Here is the code to add tasks
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
while (...) {
... // Reading some data from files
executor.submit(new MatchFutureTask(...));
}
executor.shutdown();
Một câu trả lời cho vấn đề của bạn có thể được đưa ra nếu bạn thêm một đoạn mã. Bạn đang sử dụng loại dịch vụ thi hành nào? Có nghĩa là gì (nghĩa là bao nhiêu)? –
PS: Tôi có cảm giác rằng bạn đang phải đối mặt với vấn đề rò rỉ bộ nhớ (tôi đoán trong một số phần khác của ứng dụng bạn đang giữ tham chiếu đến Callables) chứ không phải vấn đề về dịch vụ thi hành. –
@AlexCalugarescu Tôi sử dụng Executors.newFixedThreadPool() để tạo ExecuteService, vì vậy nó phải là ThreadPoolExecutor. Và "nhiều" có nghĩa là, tệp văn bản gốc có dung lượng lớn hơn 3GB, tôi đọc nó và bí mật với một số đối tượng để lưu trữ trong Callables, vì vậy tôi nghĩ rằng nó thực sự quá nhiều. – Auguste