2012-12-19 32 views
12

मैं बच्चों के पहले UrlClassLoader गतिशील जार फ़ाइल को लोड करने की है। फिर मैं भारित जार फ़ाइल के भीतर एक विधि का आह्वान करने के लिए एक प्रतिबिंब करता हूं। एक बार यह खत्म होने के बाद, मैं क्लासलोडर को अनलोड करना पसंद करता हूं। फिर मैं यह सुनिश्चित करने के लिए कुछ कोड परीक्षण कोड करने की कोशिश करता हूं कि मेरा कोड सुचारू रूप से चलता है। असल में, मैं जो करने की कोशिश करता हूं वह लूपिंग कथन के भीतर लोड और अनलोड लोड करता है।JDK1.7 classloader स्मृति रिसाव

for (int i = 0; i < 1000; i++) { 
     //Just to show the progress 
     System.out.println("LOAD NUMBER : " + i); 

     ChildFirstURLClassLoader classLoader = null; 
     try { 
      File file = new File("C:\\library.jar"); 
      String classToLoad = "com.test.MyClass"; 
      URL jarUrl = new URL("file:" + file.getAbsolutePath()); 

      classLoader = new ChildFirstURLClassLoader(new URL[] {jarUrl}, null); 
      Class<?> loadedClass = classLoader.loadClass(classToLoad); 
      Method method = loadedClass.getDeclaredMethod("execute", 
        new Class[] {}); 

      ClassLoader currCl= Thread.currentThread().getContextClassLoader(); 
      Thread.currentThread().setContextClassLoader(classLoader); 
      method.invoke(null); 
      Thread.currentThread().setContextClassLoader(currCl); 

      method = null; 
      loadedClass = null; 
     } finally { 
      if (classLoader != null) { 
       classLoader.close(); 
       classLoader = null; 
      } 
     } 
    } 

जब मैं JDK1.6 के तहत इस कोड चल रहा हूँ, classLoader.close(); बयान के बिना, कि कोड पूरी तरह से चलाता है: यहाँ मेरी कोड है। लेकिन जब मैं जेडीके 1.7 में बदल जाता हूं, कभी-कभी मुझे java.lang.OutOfMemoryError: PermGen space त्रुटि मिलती है। दुर्भाग्य से यह असंगत तरीके से होता है।

+2

आप अधिकतम पर्म जनरल की स्थापना करता है, तो यह कम मूल्यों के साथ अधिक अक्सर ऐसा होता है देखने के लिए कोशिश कर सकते। जब आप ऐसा नहीं करते हैं तो आप यह भी जांच सकते हैं कि जावा 6 के लिए अधिकतम समान है। –

+3

आपका com.test.MyClass क्लास क्या करता है? जावा 7 में कोई बदलाव आया था ताकि लंबित विधियों को कक्षा को अवरुद्ध होने से रोक दिया जा सके, शायद यही वह मुद्दा है जिसे आप यहां देख रहे हैं। OutOfMemory पर एक हीप डंप बनाएं, इसे मेमोरीएनलज़र (या एक समान टूल) में लोड करें, श्रेणी लोडर सूची और उनके लिए संदर्भ संदर्भ। – mihi

+0

पीटर और मिही धन्यवाद, मैंने अधिकतम परमिट बढ़ाने की कोशिश की है, लेकिन यह अभी भी वही है। जावा 6 में, मैं बिना किसी समस्या के 64m permgen स्पेस के साथ चलाता हूं। असल में, com.test.MyClass स्प्रिंग जेडीबीसी का उपयोग करके डेटाबेस में पूछताछ कर रहा है। मैंने पहले से ही अपने हीप डंप का विश्लेषण किया है और मैंने देखा कि क्लासलोडर में कोई मजबूत संदर्भ नहीं है। सबको शुक्रीया। – user1915918

उत्तर

2

रिसाव कहां से आता है यह पुष्टि करने का सबसे आसान तरीका स्मृति उपयोग की निगरानी करने के लिए एक प्रोफाइलर का उपयोग करना है। जेपीरोफाइलर, या विजुअलVM का प्रयास करें। यह आपको रिसाव के सटीक स्थान को इंगित करने में सक्षम करेगा, और आपको यह भी बताएगा कि आप इसे कैसे और कैसे ठीक कर सकते हैं।

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