سؤال

يفعل FileChannel#map تخصيص جميع الذاكرة اللازمة للناشئين ByteBuffer على الفور ، أم أنها مخصصة فقط عند الطلب أثناء القراءات من المخزن المؤقت؟

لقد حاولت للتو تعيين جميع ملفات أكثر من 500 ميغابايت في برنامج اختبار تافهة ، ونظرت في استخدام ذاكرة العملية. (باستخدام كليهما Runtime#totalMemory ومقلة العين في مراقبة نشاط OS X لعملية Groovysh.) لم يمر استخدام الذاكرة 30-ASH MB.

لذلك ، هل يمكن لتطبيق Java "إخفاء" بعض استخدام الذاكرة في المكالمات الأصلية؟ وإذا كان الأمر كذلك ، فهل هناك طريقة لمعرفة مقدار ما في OS X؟

هل كانت مفيدة؟

المحلول

استخدام الذاكرة ليس واضحًا أبدًا. المخزن المؤقت الفعلي المستخدم بواسطة FileChannel.map ليس جزءًا من كومة جافا. في الواقع يمكن مشاركة الذاكرة مع عمليات أخرى. قد لا تتم قراءة الملف من القرص حتى يتم لمس الصفحات.

نصائح أخرى

نعم. إنه ليس جزءًا من الكومة. ومع ذلك ، بناءً على نظام التشغيل ، ستظل هناك ذاكرة محفوظة. على OS X ، نظرًا لأنه يشبه Unix ، يجب أن تكون قادرًا على استخدام Top أو PS للتحقق من مقدار الذاكرة التي تحتاجها.

java.nio.mappedbytebuffer#سوف يؤدي التحميل إلى تحميل جميع محتويات الملفات في الذاكرة (وإلا فإنه عند الطلب):

تبذل هذه الطريقة أفضل جهد لضمان أنه عند عودته ، * محتوى هذا المخزن المؤقت مقيم في الذاكرة الفعلية. قد يتسبب استدعاء هذه الطريقة * في حدوث عدد من أخطاء الصفحات وعمليات الإدخال/الإخراج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top