मेरे पास स्कैला में एक सिस्टम है, जिसमें कई सारे थ्रेड और सिस्टम कॉल हैं। इस प्रणाली में कुछ समस्या है, क्योंकि समय के साथ स्मृति उपयोग बढ़ रहा है।स्कैला में मेमोरी लीक और प्रक्रिया
छवि bellow एक दिन के लिए स्मृति उपयोग दिखाता है। जब यह सीमा तक पहुंच जाता है, तो प्रक्रिया बंद हो जाती है और मैंने इसे फिर से ठीक करने के लिए घड़ी-कुत्ते को रखा।
मैं समय-समय पर आदेश चला
jcmd <pid> GC.run
और यह स्मृति धीरे-धीरे बढ़ाने के लिए करता है, लेकिन रिसाव अभी भी होता है।
मैंने jvisualvm के साथ विश्लेषण किया, समय में अलग-अलग क्षणों की तुलना में, 40 मिनट डेल्टा के साथ। छवि bellow समय में इन दो क्षणों के बीच तुलना दिखाता है। ध्यान दें कि ConcurrentHashMap$HashEntry
, SNode
, WeakReference
,और String
और पैकेज में कई वर्ग scala.collection.concurrent
जैसे कुछ वर्गों के उदाहरणों में वृद्धि हुई है।
क्या स्मृति रिसाव के कारण हो सकता है?
संपादित करें 1: JVisualVM जांच करते हुए, मुझे लगता है कि TriedMap में हैं CNode और inode कक्षाओं की वस्तु देखा, कि sbt.TrapExit $ अनुप्रयोग वर्ग के अंदर instanced है। यहाँ वस्तु पदानुक्रम आंकड़ा है:
http://stackoverflow.com/questions/1218872/avoiding-scala-memory-leaks-scala-constructors?rq=1 http://stackoverflow.com/questions/7944148/weakreference-and-memory-leaks http : //stackoverflow.com/questions/3871960/long-lived-java-weakreferences – Tony
मैं list.toStream.map देखता हूं, लेकिन scala.collection.concurrent कहां से आते हैं? जब आप कहते हैं कि "बहुत सारे धागे" क्या आपका मतलब है "foo.par" बहुत? मैं समांतर संग्रह में एक विशेषज्ञ के रूप में नहीं पूछ रहा हूँ। क्या आप स्पष्ट रूप से एक TrieMap का उपयोग कर रहे हैं? –
बहुत सारे धागे का मतलब है कि सैकड़ों कलाकार हैं, प्रत्येक अभिनेता सिस्टम कॉल करता है और कार्यों को अतुल्यकालिक रूप से निष्पादित करने के लिए कुछ वायदा बनाता है। मैं स्पष्ट रूप से TrieMap का उपयोग नहीं करता। –