2012-10-17 15 views
8

पर चल रहा है हमारी वेब आवेदन एक जटिल स्थितिOutOfMemoryError: PermGen अंतरिक्ष - स्प्रिंग के साथ जैस्पर रिपोर्ट बिलाव

यह एसटीएस/Tomcat 7 द्वारा विकसित एक स्प्रिंग अनुप्रयोग है मुठभेड़। आवेदन को Jasper report 4.6.0 के साथ एकीकृत करने के बाद, यह हमेशा 'आउटऑफमेमरी एरर: पर्मजेन स्पेस' फेंक देता है। फिर इसे काम करने का एकमात्र तरीका एप्लिकेशन को पुनरारंभ करना है। लेकिन थोड़ी देर के बाद यह फिर से होता है।

at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:442) 
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:378) 
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353) 
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340) 
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646) 
at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:240) 
at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:578) 
at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:49) 
at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:655) 

यहाँ कुछ निष्कर्ष जब स्थिति तब होती है इस प्रकार हैं::

Oct 17, 2012 3:42:27 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar 
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
Oct 17, 2012 3:42:30 PM org.apache.catalina.core.ApplicationDispatcher invoke 
SEVERE: Servlet.service() for servlet jsp threw exception 

यहाँ मैं जहां पाया चीज के बारे में Jasper अपवाद के भीतर एक वर्ग है: यहाँ अपवाद से पहले लॉग ऑन है

  1. समस्या किसी भी जैस्पर रिपोर्ट घटकों के बिना पृष्ठ पर हो सकती है। ऐसा लगता है कि जैस्पर रिपोर्ट बीन हर समय एक टैग lib खोजने की कोशिश कर रहा है जब a request is processed by the back end and responded to the front end। आम तौर पर लॉग फ़ाइल से मैं देख सकता हूं कि उपरोक्त अपवाद तब तक नहीं फेंक देगा जब तक कि सभी बैक एंड ऑपरेशंस (जेपीए प्रबंधन) पूर्ण नहीं हो जाते हैं

  2. डीबग मोड पर लॉग 4 जे चलाते समय, मुझे बहुत सारी जानकारी दिखाई देती है जैसे सभी घटकों को पार्सिंग/प्रतिपादित करना

    2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester.sax -- startElement(http://jasperreports.sourceforge.net/jasperreports,textElement,textElement) 
    2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- Pushing body text '' 
    2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- New match='jasperReport/summary/band/textField/textElement' 
    2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- Fire begin() for FactoryCreateRule[className=net.sf.jasperreports.engine.xml.JRTextElementFactory, attributeName=null, creat[email protected]12dc6007] 
    2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- [FactoryCreateRule]{jasperReport/summary/band/textField/textElement} New net.sf.jasperreports.engine.design.JRDesignTextField 
    2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester.sax -- ignorableWhitespace() 
    

    फिर भी, इस लॉग उत्पन्न होती है जब पृष्ठ नहीं है के लिए एक अनुरोध किसी भी जैस्पर घटक शामिल हैं: जैस्पर टेम्पलेट (textfields, कलम, बॉक्स ...), वहाँ विशाल लॉग से एक छोटे से कटौती है।

मैंने कुछ शोध किया लेकिन अभी भी इस मुद्दे का समाधान नहीं मिल रहा है।

  1. पहला सवाल वहाँ आवेदन कारण है कि यह हमेशा (वर्तमान पृष्ठ अर्थ किसी भी जैस्पर घटक नहीं है) जब यह भी वर्तमान सेवा के साथ autowired नहीं है चल रहा है में एक jasperreport bean भी है। क्या इस स्थिति का कोई समाधान/उत्तर है?

  2. अपवाद संदेश टीएलडी के लिए कम से कम एक जेएआर स्कैन किया गया था, फिर भी कोई टीएलडी नहीं था। org.apache.jasper.compiler.JDTCompiler.generateClass पर (JDTCompiler.java:442)

    चाहिए बिलाव, और Tomcat never contains any JSTL jar से आता है, तो मैं यह जैस्पर रिपोर्ट इसलिए पार्स एक पूर्ण स्कैन करने के लिए एक मैच टीएलडी नहीं मिल सकता है ग्रहण सभी जारों का। यदि ऐसा है, तो org.apache.commons.digester.Digester से बड़ी संख्या में डीबग लॉग कैसे आते हैं वास्तव में जेस्पर टेम्पलेट को पार्स करने में व्यस्त लगता है?

सामान्य तौर पर, सिर्फ समस्या का समाधान यह पता लगाने की कोशिश कर रहा है, और यह भी कारण है कि जैस्पर इतना सक्रिय पर एक जगह यह आवश्यकता नहीं है है का उत्तर नहीं मिलता, और हम कैसे कर सकते हैं इस सूत्र बनाना टोमकैट ने टेम्पलेट्स को सही तरीके से पार्स किया?

यदि वर्बोज़ भी माफी माँगती है, और किसी भी संकेत के लिए धन्यवाद।

+0

तो, आप PermGen के आकार में वृद्धि करने की कोशिश की है? ऐसा नहीं है कि कई अन्य तरीके हैं। –

+0

@Frank Pavageau हाँ मैंने कोशिश की है, यह 512 एम के लिए रखा, लेकिन अभी भी एक ही मुद्दे को मिलता है ... यह 'catalina.sh' और JAVA_OPTS में है =" ...- XX: MaxPermSize = 512 एम ... "? – Dreamer

+1

@FrankPavageau ऐसा लगता है Jasper रिपोर्ट कुछ विन्यास के साथ मुद्दों इस तरह है, तो Jasper रिपोर्ट में मूल कारण के निवारण के बहुत अच्छी तरह से संभव हो सकता है। – eis

उत्तर

8

आप इस मुद्दे के बारे में समाधान देने के लिए हर किसी को धन्यवाद, मैं अपने स्थिति के लिए विशेष रूप से समस्या की पहचान और यहाँ समाधान है है

उपयोग .jrxml के बजाय .jasper टेम्पलेट के रूप में!

जैसा कि हम जानते .jasper एक संकलित टेम्पलेट के साथ-साथ .jrxml है, टेम्पलेट के लिए ASCII स्रोत कोड है, इसलिए यदि हम वर्तमान वसंत आवेदन में कच्चे स्रोत कोड फ़ाइल (jrxml) टेम्पलेट के रूप में उपयोग तो कम से कम वसंत फ्रेम काम करने के लिए है स्रोत कोड फ़ाइल संकलित करें। वसंत ढांचे के लिए दक्षता का यह सवाल है क्योंकि यह संकलन को संभालने के लिए जैस्पर बीन है और यह केवल एक बार निष्पादित संकलन की गारंटी नहीं देता है और केवल तब होता है जब एप्लिकेशन शुरू होता है।

संक्षेप में, के बाद .jasper फ़ाइल के साथ सभी टेम्पलेट्स की जगह, लॉग आकार काफी कम हो गया है और किसी भी अधिक स्मृति मुद्दे से बाहर नहीं देखा है। मुझे लगता है कि स्प्रिंग कंटेनर जेएसएक्सएमएल को रनटाइम पर जेस्पर को संकलित करने के लिए बहुत सारे संसाधनों का उपभोग कर सकता है। तो यह हो सकता है कुछ जैस्पर या वसंत द्वारा सुधार किया है चाहिए ....

+0

यह वही है जो मुझे धन्यवाद चाहिए .. – Youddh

2

इन पैरामीटर को अपने वीएम में सेट करने का प्रयास करें। ये आपके permGen की सफाई जीसी सक्षम करना चाहिए।

-XX:+UseConcMarkSweepGC 
-XX:+CMSPermGenSweepingEnabled 
-XX:+CMSClassUnloadingEnabled 
+0

धन्यवाद किया जाना चाहिए त्रुटि स्थिति और विश्लेषण का एक ढेर डंप हो रही @Dreamer। क्या आप वाकई जेएमवी को टॉमकैट नहीं करते हैं? क्या इस बदलाव से प्रदर्शन प्रभाव पड़ता है? – Dreamer

+0

पर्मजेन ओओएम आमतौर पर होता है _because_ जीसी भाग गया लेकिन स्मृति मुक्त नहीं कर सका, क्योंकि जीसी पर्मजेन का ख्याल नहीं रख रहा है। –

+1

वास्तव में समस्या का निदान करने के लिए, आपको '-XX: + HeapDumpOnOutOfMemoryError' भी जोड़ना चाहिए ताकि आपको एक ढेर डंप मिल सके। अगर यह परमिट त्रुटि पर काम करता है तो सुनिश्चित करें, लेकिन मैं कोशिश करने की सिफारिश करता हूं। उस ढेर डंप को फिर मैट या इसी तरह से चलाया जाना चाहिए। – eis

0

के बाद से PermGen मुख्य रूप से वर्ग मेटाडाटा, और निरंतर और प्रशिक्षु स्ट्रिंग्स होता है, आप दो दिशाओं में खोज कर सकते हैं:

  • जाँच लें कि webapp शामिल नहीं है (बहुत) बेकार जार, जो स्कैनिंग की वजह से लोड हो सकता है

  • (उदाहरण के लिए बड़े JSPs के बहुत सारे) एक हीप डंप का उपयोग कर अपने कोड String.intern का उपयोग करता है() यदि आप निरंतर स्ट्रिंग्स पास बहुत देखते हैं, या


असल में, आप निर्दिष्ट नहीं किया है जावा का कौन सा संस्करण उपयोग कर रहे थे: जावा 7 के साथ, स्ट्रिंग एक मुद्दा नहीं हो सकता है।

आप क्या कर सकते हैं, जेवीएसयूएलवीएम के साथ अनुप्रयोगों का निरीक्षण करना, पीडीएफ की स्थिति देखने के लिए, लोड वर्गों की संख्या और ओओएम के समय या तो उछाल है या नहीं, यह एक धीमी बिल्ड-अप है।

7

अपवाद तब होता है जब JVM में परमजन स्पेस में बहुत अधिक .class फ़ाइलें होती हैं जिन्हें AppClassLoader के बाहर किसी ऑब्जेक्ट के संदर्भ के कारण कचरा नहीं किया जा सकता है। यह आमतौर पर कुछ स्मृति को आपकी प्रशंसा रिसाव बताता है। PermGen अंतरिक्ष त्रुटि है और एक निम्नलिखित post यह कैसे ठीक करने के सुझाव है:

This पद java.lang.OutOfMemoryError की एक स्पष्ट अर्थ व्याख्या है। एक समान (लेकिन बिल्कुल वही नहीं) question को एसओ पर पूछा गया था, अगर आपको यह याद आती है तो आपको बताएं। मुझे उम्मीद है यह मदद करेगा।

जैसा कि जकूब ने -XX:+CMSClassUnloadingEnabled-XX:+CMSPermGenSweepingEnabled सेटिंग सेट करने का उल्लेख किया है या XX:MaxPermSize के लिए उच्च मान निर्धारित करना आपके लिए काम कर सकता है। लेकिन मैंने जो पढ़ा है, उससे यह एक स्थायी समाधान नहीं है। (मैं इस में एक मास्टर नहीं हूँ :))।

+0

लिंक पर अच्छी पोस्ट। अगर किसी को उन पदों को बेहतर तरीके से पढ़ने के बारे में कुछ अंतर्दृष्टि की आवश्यकता है। धन्यवाद। –

2

मैं जो JasperReports 4.5.1

मैं एक कंटेनर के रूप में बिलाव 6.0.26 का उपयोग का उपयोग करता है एक वेब अनुप्रयोग विकसित किया है। (Win7, JDK 1.6.0_25)

जब बंद बिल्ला, फेंक:

वेब अनुप्रयोग प्रकार के प्रमुख [net.sf.jasperreports.engine.util.JRFontUtil $ 1] (मूल्य के साथ एक ThreadLocal बनाया [[email protected]]) और प्रकार का एक मूल्य [java.util.HashSet] (मान [[]]) लेकिन वेब एप्लिकेशन बंद होने पर इसे हटाने में विफल रहा। यह मेमोरी रिसाव बनाने की संभावना है।

कृपया वेबसाइट पर जाएँ:

http://community.jaspersoft.com/questions/534340/memory-leak-jr-373

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