हमारे आवेदन में हमारे पास कई (लगभग कई, लगभग 30) वेब सेवाएं हैं। प्रत्येक वेब सेवा अपनी स्वयं की WAR फ़ाइल में रहती है और इसका अपना वसंत संदर्भ होता है जिसे एप्लिकेशन प्रारंभ होने पर प्रारंभ किया जाता है।बहुत से वर्ग स्कैनिंग और विधि कैश स्कैनिंग मेमोरी
हमारे पास कई एनोटेशन-संचालित पहलू वर्ग भी हैं जिन्हें हम वेब सेवा कक्षाओं पर लागू करते हैं। poincut अभिव्यक्ति शुरुआत में इस तरह देखा:
@Pointcut("execution(public * my.package.service.business.*BusinessServiceImpl.*(..))")
public void methodsToBeLogged() {
}
और AOP विन्यास में प्रवेश के माध्यम से सेवाओं पर सक्षम किया गया था।
लेकिन जब वेब सर्विसेज की संख्या बढ़ी, तो हमने अपने सर्वर पर OutOfMemoryException
एस का अनुभव करना शुरू कर दिया। कुछ प्रोफाइलिंग और विश्लेषण करने के बाद यह दिखाई दिया कि स्मृति को कैश द्वारा लिया जाता है जिसे AspectJExpressionPointcut क्लास के उदाहरणों द्वारा रखा जाता है।
प्रत्येक उदाहरण का कैश लगभग 5 एमबी था। और चूंकि हमारे पास 3 पहलुओं और 30 सेवाओं के परिणामस्वरूप कुल मिलाकर 450 एमबी डेटा रखने वाले 9 0 उदाहरण सामने आए।
कैश की सामग्री की जांच करने के बाद हमें एहसास हुआ कि इसमें WAR में मौजूद सभी वर्गों के लिए जावा प्रतिबिंब विधि उदाहरण हैं जो मेरे.package.service.business पैकेज का हिस्सा नहीं हैं।
@Pointcut("execution(public * my.package.service.business.*BusinessServiceImpl.*(..)) &&
within(my.package.service.business..*)")
public void methodsToBeLogged() {
}
मेमोरी उपयोग फिर से सामान्य करने के लिए नीचे था: बिंदु कटौती अभिव्यक्ति modifing के बाद अतिरिक्त within
खंड है। और सभी AspectJExpressionPointcut उदाहरणों को एक साथ 1 एमबी से कम ले लिया।
कोई बता सकता है कि वह क्यों है? और क्यों पहली बार कट अभिव्यक्ति पर्याप्त नहीं है? AspectJExpressionPointcut
का कैश क्यों साझा नहीं किया गया है?
उत्कृष्ट उत्तर! –