2016-07-11 8 views
10
के तहत एक MappedByteBuffer

जावा में सामान्य समस्या यह है कि आप to hack है स्मृति फ़ाइलों मैप किया गया का एक उचित unmapping पाने के लिए है - 14year पुराने बग रिपोर्ट के लिए here देख;)unmapping या 'रिलीज' एंड्रॉयड

लेकिन वहाँ Android पर प्रतीत होता है कि शुद्ध जावा में 0 समाधान और एनडीके के माध्यम से। क्या ये सच है? यदि हां, एंड्रॉइड/जावा बाइंडिंग के साथ ओपन सोर्स समाधान के लिए कोई संकेतक?

+0

यहाँ इस सवाल का कारण है: http: //stackoverflow.com/questions/38293892/java-mmap-fails-on-android-with-mmap-failed-enomem-out-of-memory – Karussell

उत्तर

0

Android Developers वेबसाइट से:

एक सीधा बाइट बफर जिनकी सामग्री फ़ाइल की एक स्मृति-मैप किया क्षेत्र है।

मैप किए गए बाइट बफर FileChannel.map विधि के माध्यम से बनाए जाते हैं। यह वर्ग बाइटबफर वर्ग को उन परिचालनों के साथ विस्तारित करता है जो स्मृति-मैप किए गए फ़ाइल क्षेत्रों के लिए विशिष्ट हैं।

मैप किए गए बाइट बफर और फ़ाइल मैपिंग जो यह दर्शाता है तब तक वैध रहता है जब तक बफर स्वयं कचरा-संग्रह नहीं होता है।

मैप किए गए बाइट बफर की सामग्री किसी भी समय बदल सकती है, उदाहरण के लिए यदि मैप किए गए फ़ाइल के संबंधित क्षेत्र की सामग्री इस प्रोग्राम या किसी अन्य द्वारा बदल दी गई है। चाहे ऐसे परिवर्तन होते हैं या नहीं, और जब वे होते हैं, ऑपरेटिंग-सिस्टम निर्भर है और इसलिए निर्दिष्ट नहीं है।

मैं क्या इस पाठ से समझ लिया है का सवाल है, एंड्रॉयड जावा SDK का उपयोग MappedByteBuffer unmap का कोई उपाय नहीं है कि वहाँ है। केवल एनडीके का उपयोग करके, जैसा कि आपने कहा था।

+0

कोई आधिकारिक तरीका नहीं है, हां। लेकिन क्या डेस्कटॉप पर एक 'अनधिकृत' तरीका है? और यदि नहीं, तो क्या आप एनडीके समाधान के लिए कुछ ओपन सोर्स लिब जानते हैं? – Karussell

+0

मैं जांच करूंगा और मैं आपको बता दूंगा –

+0

मैंने जांच की है और कुछ भी नहीं मिला है ... –

1

एंड्रॉइड के तहत कोई हैक उपलब्ध नहीं है।

लेकिन वहाँ कुछ सहायकों और स्निपेट जो सी-जावा mmap आसान फ़ाइलों के लिए बाध्यकारी कर रहे हैं/आसान:

कार्रवाई में util-mmap देखें हटाएँ:

public class MMapTesting { 

    public static void main(String[] args) throws IOException { 
     File file = new File("test"); 
     MMapBuffer buffer = new MMapBuffer(file, 0, 1000, FileChannel.MapMode.READ_WRITE, ByteOrder.BIG_ENDIAN)) { 
      buffer.memory().intArray(0, 100).set(2, 234); 
     // calls unmap under the hood 
     buffer.close(); 

     // here we call unmap automatically at the end of this try-resource block 
     try (MMapBuffer buffer = new MMapBuffer(file, FileChannel.MapMode.READ_WRITE, ByteOrder.BIG_ENDIAN)) { 
      System.out.println("length: " + buffer.memory().length()); 
      IntArray arr = buffer.memory().intArray(0, buffer.memory().length()/8); 
      // prints 234 
      System.out.println(arr.get(2)); 
     } 
    } 
} 
+0

डाउनवोट क्यों? – Karussell

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