2011-06-22 16 views
7

मैं सोच रहा हूं कि कचरा संग्रह कैसे काम करता है जब आपके पास कुछ फ़ील्ड मान प्राप्त करने के लिए प्रतिबिंब वाले वर्ग होते हैं। JVM को कैसे पता है कि इन क्षेत्रों द्वारा मान संदर्भ सुलभ हैं और इसलिए वर्तमान क्षण में कचरा संग्रहण के लिए योग्य नहीं है, जब औपचारिक भाषा वाक्यविन्यास का उपयोग उन तक पहुंचने के लिए नहीं किया जाता है?कचरा संग्रह और प्रतिबिंब

एक छोटा सा टुकड़ा मुद्दा यह दर्शाता है (हालांकि प्रतिबिंब अधिक बल यहाँ किया गया है):,

/** 
* 
*/ 

import java.lang.reflect.Field; 

public class B { 
    protected B previous = null, next = null; 

    /** 
    * 
    */ 
    public B(B from) { 
     this.previous = from; 
    } 

    public void transition(B to) { 
     this.next = to; 
    } 

    public B next() { 
     try { 
      Field f = getClass().getField("next"); 
      f.setAccessible(true); 
      try { 
       return (B)f.get(this); 
      } finally { 
       f.setAccessible(false); 
      } 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 

    public B previous() { 
     try { 
      Field f = getClass().getField("previous"); 
      f.setAccessible(true); 
      try { 
       return (B)f.get(this); 
      } finally { 
       f.setAccessible(false); 
      } 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 
} 

चीयर्स,
क्रिस

+0

दिलचस्प सवाल। क्या यह किसी प्रकार के एम्बेडेड जावा एप्लिकेशन से प्रेरित था? –

+0

क्या आप "कोड के कुछ मूल्य प्राप्त करने के लिए उपयोग किए गए प्रतिबिंब वाले वर्ग" का अर्थ स्पष्ट करने के लिए एक कोड स्निपेट शामिल कर सकते हैं? –

+0

वास्तव में, मैं नेटवर्किंग ढांचे के लिए एक परीक्षण पर काम कर रहा हूं, और कुछ क्षेत्रों को प्रतिबिंब द्वारा उपयोग किया जाता है। आश्चर्य की बात है कि कैसे प्रतिबिंब स्मृति उपयोग पर असर डालता है, शायद JVM बनाए रखने वाले ऑब्जेक्ट्स के बारे में यह अनिश्चित है। –

उत्तर

10

आप एक उदाहरण के क्षेत्रों तक पहुँच रहे हैं, तो आप करेंगे अभी भी उस उदाहरण के संदर्भ की आवश्यकता है। उस मामले के लिए जीसी के बारे में असामान्य कुछ भी नहीं होगा।

+0

धन्यवाद, यह समझ में आता है :) –

5

किसी ऑब्जेक्ट के किसी फ़ील्ड तक पहुंचने के लिए आपके पास उस ऑब्जेक्ट का संदर्भ होना चाहिए। यदि आप इसे प्रतिबिंब या सीधे के माध्यम से एक्सेस करते हैं, तो इससे कोई फर्क नहीं पड़ता कि आपके पास ऑब्जेक्ट का मजबूत संदर्भ है या नहीं।

1

यह एक अजीब परीक्षण मामला है: आप "इस" तक पहुंचने के लिए प्रतिबिंब का उपयोग कर रहे हैं। परिभाषा के अनुसार, "यह" लाइव है जब घोषणा कक्षा के उदाहरण विधि में उपयोग किया जाता है, इसलिए जीसीड नहीं किया जाएगा।

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

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