2011-12-05 8 views
15

हम सीडीआई का उपयोग कर हमारी बैकएंड सेवाओं को लागू करने के साथ प्रयोग करना शुरू कर रहे हैं। परिदृश्य यह है:सीडीआई आवेदन और आश्रित स्कोप कचरा संग्रह को प्रभावित करने के लिए षड्यंत्र कर सकते हैं?

ईएआरबी @Startup के साथ शुरू होता है जब ईएआर तैनात किया जाता है। एक ApplicationScoped सेम इस पर इंजेक्ट किया जाता है:

@ApplicationScoped 
public class JobPlatform { 

    private PooledExecutor threadHolder; 

    @Inject @Any 
    private Instance<Worker> workerSource; 
... 

सेम भी एक पर्यवेक्षक विधि है, जो है, जब एक घटना मनाया जाता है, उदाहरण workerSource से एक कार्यकर्ता सेम हो जाता है और ThreadPool, जहां यह अंत में चलाता है पर कहते है पूरा करने के लिए।

सभी अच्छी तरह से काम कर रहे हैं। हालांकि ... हमने कचरा संग्रहण मुद्दों को देखना शुरू कर दिया है। एक जेएमएपी हीप हिस्टोग्राम से पता चलता है कि इनमें से कई कर्मचारी लटकते हैं, गैर-कचरा इकट्ठा किया जाता है।

हम मानते हैं कि यह सीडीआई स्कॉइंग के संयोजन के लिए नीचे है। @Dependant के लिए एपीआई पेज (http://docs.jboss.org/cdi/api/1.0-SP1/javax/enterprise/context/Dependent.html) अधिक स्पष्ट रूप से क्या पुष्ट डॉक्स में:

  • गुंजाइश के साथ एक सेम @Dependent एक क्षेत्र में इंजेक्शन का एक उदाहरण, सेम निर्माता या प्रारंभकर्ता विधि का एक आश्रित वस्तु है बीन या जावा ईई घटक वर्ग उदाहरण जिसमें इसे इंजेक्शन दिया गया था।
  • एक निर्माता विधि में इंजेक्शन वाले दायरे @ परस्पर निर्भर के साथ एक बीन का एक उदाहरण निर्माता विधि बीन उदाहरण का एक आश्रित वस्तु है जिसे उत्पादित किया जा रहा है।
  • किसी इंस्टेंस के प्रत्यक्ष आमंत्रण द्वारा प्राप्त दायरे @ परस्परेंट के साथ एक बीन का एक उदाहरण इंस्टेंस के उदाहरण का एक निर्भर वस्तु है।

तो, निम्नलिखित इस:

  • workerSource सेम JobPlatform के लिए बाध्य है, और इसलिए एक ApplicationScoped जीवन
  • किसी भी कार्यकर्ता सेम कि उदाहरण का उपयोग करते हुए इसे करने के लिए बाध्य कर रहे हैं लिया गया है, और इसलिए एक एप्लीकेशनस्कोप्ड लाइफटाइम
  • क्योंकि एप्लिकेशनस्पेड संदर्भ के बीनस्टोर (शब्दावली का मेरा ज्ञान यहां थोड़ा आलसी हो जाता है) अभी भी एक पुनः है श्रमिक सेम की करुणा, वे नष्ट नहीं हुए/कचरा एकत्र नहीं किया गया

क्या कोई भी सीडीआई का उपयोग कर इस से सहमत है? क्या आपने कचरा संग्रह की कमी का अनुभव किया है और यदि ऐसा है, तो क्या आप किसी भी कामकाज का सुझाव दे सकते हैं?

श्रमिक एप्लिकेशनस्कोप्ड नहीं हो सकते हैं, फिर भी प्लेटफॉर्म होना चाहिए। अगर हम एक कस्टम वर्करस्कोप (ओह ओह ...) बनाना चाहते थे और प्रत्येक कार्यकर्ता वर्ग को इसके साथ एनोटेट करना चाहते थे, तो क्या वह कार्यकर्ता और उदाहरण स्रोत के बीच निर्भरता को अलग करने के लिए पर्याप्त होगा?

Is it possible to destroy a CDI scope? पर कुछ सुझाव भी दिए गए हैं जो मैं देखूंगा, लेकिन कुछ बैकअप चाहता था कि स्कोपिंग वैध कारण की तरह दिखती है या नहीं।

आशा है कि आप मदद कर सकते हैं, धन्यवाद।

उत्तर

9

आपकी समझ सही है। यह कल्पना में एक निरीक्षण था, और कुछ ऐसा जो सीडीआई 1.1 में तय किया जाएगा। Instance में मेमोरी रिसाव हो सकता है जैसा आपने वर्णन किया है जब लंबे समय तक चलने वाले दायरे में उपयोग किया जाता है जैसे कि SessionScoped या ApplicationScoped।उदाहरण के लिए आपको Contextual या Bean को पकड़ने की आवश्यकता होगी और इसे इस तरह नष्ट कर दें।

आप जो कर रहे हैं उसके लिए, और मेमोरी रिसाव से बचने के लिए आप उदाहरण बनाने के लिए बीनमैनेजर विधियों का उपयोग करने के लिए सबसे अच्छे हैं (इस तरह आप Bean पर हैंडल भी लेंगे और इसे नष्ट कर सकते हैं) Instance

+0

धन्यवाद बहुत जल्दी वापस पाने के लिए बहुत कुछ - यह जानना अच्छा है कि यह एक मान्यता प्राप्त है मुद्दा। कामकाज अब जाओगे! चीयर्स! –

+0

किसी और को यहां पढ़ने के लिए, ध्यान दें कि वेल्ड 1.1 सीडीआई 1.0 लागू करता है, सीडीआई 1.1 नहीं। –

+0

सही क्रेग। वेल्ड 2.0 सीडीआई 1.1 लागू करता है (हाँ, मुझे पता है कि संख्या अजीब है)। यदि आप देखना चाहते हैं कि सीडीआई 1.1 कैसा होगा, तो वेल्ड 2.0 आज़माएं। मेरा मानना ​​है कि जेबॉस एएस 7 के विशेष निर्माण हैं जिनमें वेल्ड 2.0 शामिल है। – LightGuard

2

जेसन के सुझाव वैकल्पिक हल को लागू करने में देखते हुए मैं इस मुद्दे से संबंधित कुछ और संसाधन पाया:

मुद्दा: https://issues.jboss.org/browse/CDI-139 और https://issues.jboss.org/browse/WELD-920

उदाहरण beanManager संचालन: https://issues.jboss.org/browse/CDI-14?focusedCommentId=12601344&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-12601344

या org.jboss.seam.faces.util.BeanManagerUtils

संबंधित मुद्दे