2008-11-27 11 views
8

को हटाने के बाद सिस्टम मेमोरी का उपयोग करता है मैं जेवीएम 1.5.0 (मैक ओएस एक्स डिफ़ॉल्ट) चला रहा हूं, और मैं गतिविधि मॉनिटर में अपने जावा प्रोग्राम की निगरानी कर रहा हूं। मैं निम्नलिखित है:जावा अभी भी ऑब्जेक्ट्स और कचरा संग्रह

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.Date; 

public class MemoryTest { 

public static void memoryUsage() { 
System.out.println(
    Runtime.getRuntime().totalMemory() - 
    Runtime.getRuntime().freeMemory() 
); 
} 

public static void main(String[] args) throws IOException { 

    /* create a list */ 
    ArrayList<Date> list = new ArrayList<Date>(); 

    /* fill it with lots of data */ 
    for (int i = 0; i < 5000000; i++) { 
     list.add(new Date()); 
    } // systems shows ~164 MB of physical being used 

    /* clear it */ 
    memoryUsage();  // about 154 MB 
    list.clear(); 
    list = null; 
    System.gc(); 
    memoryUsage();  // about 151 KB, garbage collector worked 

    // system still shows 164 MB of physical being used. 
    System.out.println("Press enter to end..."); 
    BufferedReader br = new BufferedReader( 
      new InputStreamReader(System.in) 
      ); 
    br.readLine(); 
} 

}

तो क्यों भौतिक स्मृति को मुक्त कर दिया नहीं प्राप्त करता है, भले ही कचरा कलेक्टर अच्छे से कार्य करती है?

+0

ऑपरेटिंग सिस्टम एक आभासी स्मृति प्रणाली है कि द्वारा। JVM भौतिक स्मृति पर नहीं है। मुझे लगता है कि आप वास्तव में मतलब है, JVM क्यों वर्चुअल एड्रेस रेंज को प्रतिबंधित करता है। – Raedwald

उत्तर

19

कई जेवीएम ऑपरेटिंग सिस्टम में कभी भी स्मृति वापस नहीं करते हैं। चाहे वह ऐसा करता है या नहीं, कार्यान्वयन-विशिष्ट है। उन लोगों के लिए, स्टार्टअप पर निर्दिष्ट स्मृति सीमा, आमतौर पर -एक्सएमएक्स ध्वज के माध्यम से, अन्य अनुप्रयोगों के लिए स्मृति आरक्षित करने के प्राथमिक माध्यम हैं।

मैं इस विषय पर प्रलेखन ढूँढने एक कठिन समय चल रहा है, लेकिन garbage collector documentation for Sun's Java 5 इसे संबोधित करता है, सुझाव है कि सही परिस्थितियों में, ढेर अगर की अधिक है कि 70% है, तो सही कलेक्टर डिफ़ॉल्ट रूप से प्रयोग किया जाता है — हटना होगा, ढेर मुक्त है, यह कम हो जाएगा ताकि केवल 40% मुक्त हो। इन्हें नियंत्रित करने के लिए कमांड लाइन विकल्प -XX:MinHeapFreeRatio और -XX:MaxHeapFreeRatio हैं।

+0

मेरे पास स्पष्टीकरण है। ऊपर दिए गए विशेष परीक्षण मामले में, System.gc को कॉल करने से कुछ स्मृति मुक्त हो जाएगी, भले ही टिप्पणी सूची स्पष्ट और शून्य न हो। यहां सूची सक्रिय है, इसलिए कौन सी मेमोरी फ्रीज है – UVM

0

क्या ओएस शायद वर्तमान में प्रोग्राम को आवंटित स्मृति दिखा रहा है - भले ही 150 ~ एमबी आवंटित हो, इसका मतलब यह नहीं है कि 150 ~ एमबी उपयोग में है।

3

आपको JVM को आवंटित स्मृति के विपरीत प्रोग्राम द्वारा उपयोग की जाने वाली वास्तविक ढेर स्पेस की निगरानी करने के लिए एक JVM- विशिष्ट प्रोफाइलर का उपयोग करने की आवश्यकता है।

जेवीएम केवल आवंटित ढेर मेमोरी को रिलीज़ करने के लिए अनिच्छुक नहीं है, लेकिन अलग-अलग कारणों के लिए ऊपर स्थान को गोद लेता है, जिसमें केवल समय-समय पर संकलन शामिल है।

5

जेवीएम के लिए कई कमांड लाइन विकल्प हैं जो जावा द्वारा उपयोग किए गए ढेर के आकार को ट्यून करने में मदद करते हैं। हर कोई -Xms और -Xmx के बारे में जानता है (या पता होना चाहिए), जो ढेर के न्यूनतम और अधिकतम आकार को सेट करता है।

लेकिन यह भी है-XX: MinHeapFreeRatio और -XX: MaxHeapFreeRatio जो संबंधित सीमाएं हैं जिनके बीच जेवीएम मुक्त स्थान प्रबंधित करता है। यह प्रयुक्त ढेर को कम करके यह करता है, और यह प्रोग्राम की स्मृति खपत को कम कर सकता है।

अधिक जानकारी आप यहाँ पा सकते हैं:

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