मुझे WeakHashMap के साथ कुछ परेशानी का सामना करना पड़ा।क्या वीक हैशैप एक पूर्ण जीसी के दौरान साफ़ हो गया है?
List<byte[]> list = new ArrayList<byte[]>();
Map<String, Calendar> map = new WeakHashMap<String, Calendar>();
String anObject = new String("string 1");
String anOtherObject = new String("string 2");
map.put(anObject, Calendar.getInstance());
map.put(anOtherObject, Calendar.getInstance());
// In order to test if the weakHashMap works, i remove the StrongReference in this object
anObject = null;
int i = 0;
while (map.size() == 2) {
byte[] tab = new byte[10000];
System.out.println("iteration " + i++ + "map size :" + map.size());
list.add(tab);
}
System.out.println("Map size " + map.size());
इस कोड काम करता है:
इस नमूना कोड पर विचार करें। लूप के अंदर, मैं ऑब्जेक्ट बना रहा हूं। जब एक मामूली जीसी होता है, तो नक्शा का आकार 1360 वें पुनरावृत्ति पर 1 के बराबर होता है। सब ठीक है।
अब जब मैं इस लाइन टिप्पणी:
//anObject = null;
मैं एक OutOfMemoryError की अपेक्षा mapSize हमेशा 2. के बराबर है क्योंकि हालांकि 26XXX वीं यात्रा पर, एक पूर्ण जीसी होता है और नक्शे का आकार बराबर है 0 तक मुझे समझ में नहीं आता क्यों?
मैंने सोचा कि नक्शा साफ़ नहीं होना चाहिए क्योंकि दोनों वस्तुओं के मजबूत संदर्भ भी हैं।
मुझे लगता है कि आपका परीक्षण सही नहीं है। यदि आप 'while (map.size() == 2) {' to 'जबकि (map.size()> 0) {', दो परीक्षण तब तक समाप्त हो जाएंगे जब तक नक्शा खाली न हो, चाहे आप टिप्पणी करें 'anObject = शून्य 'या नहीं। बीटीडब्ल्यू, मैंने पहले ही कोशिश की है। – donnior
अंत में 'anObject' और' anOtherObject' प्रिंट करें। कंपाइलर देखता है कि अब आप उनका उपयोग नहीं कर रहे हैं और उन्हें पहले हटा सकते हैं। –