मेरे पास multithreading
के साथ निष्पादित करने की आवश्यकता है।निष्पादक सेवा का उपयोग करते समय स्मृति का प्रबंधन कैसे करें?
मैं ExecutorService
का उपयोग Callable objects
के बहुत सारे प्रस्तुत करने के लिए, और प्रत्येक Callable object
कुछ resource
जो क्रियान्वित करने के लिए आवश्यक है शामिल हैं।
समस्या
इन कार्यों इतने सारे कि Callable objects
ExecutorService
को प्रस्तुत की बहुत अधिक स्मृति पर कब्जा तो heap
समाप्त हो रहा है कर रहे हैं।
मैं जानना चाहता हूं कि JVM
इन Callable objects
के लिए जगह कब जारी करता है?
क्या यह कार्य पूरा होने के तुरंत बाद ऐसा करता है और मैं ExecutorService
के लिए उपयोग की गई मेमोरी का प्रबंधन कैसे कर सकता हूं?
मैं ExecutorService
पर सबमिशन को नियंत्रित करना चाहता हूं, उदाहरण के लिए, जब स्मृति पर्याप्त नहीं है तो सबमिशन को कुछ कार्यों को पूरा करने और मुक्त स्थान का उपयोग करने से रोकें। यह हो सकता है?
पूरा कोड बहुत जटिल है, मैं अपने कोड का मुख्य फ्रेम संलग्न करूंगा।
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();
आपकी समस्या का उत्तर दिया जा सकता है आप एक कोड स्निपेट शामिल हैं। आप किस प्रकार की एक्जिक्यूटर सेवा का उपयोग कर रहे हैं? कई अर्थ क्या हैं (यानी कितने लोग हैं)? –
पीएस: मुझे एहसास है कि आप वास्तव में एक स्मृति रिसाव समस्या का सामना कर रहे हैं (मुझे लगता है कि आपके ऐप के किसी अन्य भाग में आप अपने कॉलबल्स के संदर्भ धारण कर रहे हैं) और निष्पादक सेवा समस्या नहीं। –
@AlexCalugarescu मैं निष्पादक सेवा बनाने के लिए execors.newFixedThreadPool() का उपयोग करता हूं, इसलिए यह ThreadPoolExecutor होना चाहिए। और "कई" का अर्थ है, मूल पाठ फ़ाइल 3 जीबी से अधिक है, मैंने इसे पढ़ा और कॉलबल्स में स्टोर करने के लिए कुछ ऑब्जेक्ट्स में गुप्त किया, इसलिए मुझे लगता है कि यह वास्तव में बहुत अधिक है। – Auguste