سؤال

هل هناك .NET API للحصول على معلومات مفصلة حول استخدام VM؟ أنا مهتم على وجه التحديد بتحديد مدى تجزئة مساحة عنواني.

شكرًا!

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

المحلول

نوع وظائف واجهة برمجة تطبيقات Windows التي يمكن أن تمنحك بعض البصيرة في هذا هو VirtualQueryex () لتعداد أقسام الذاكرة الافتراضية واكتشاف مساحة غير مستخدمة ، getProcessheaps () للعثور على أكوام يتم إنشاؤها داخل العملية و heapwalk () لاكتشاف الكتل في يتم استخدام كل كومة.

لن يكون هذا سهلاً ، لا سيما HeapWalk () هي وظيفة مزعجة في برنامج تشغيل. يجب عليك إلقاء نظرة على sysinternals فائدة VMMAP, ، يوفر تشخيصات ذاكرة افتراضية ممتازة.

سقوط هذا هو أنه لا يساعدك حقًا في حل مشكلة تجزئة الذاكرة. لا يوجد شيء يمكنك القيام به للتأثير على الطريقة التي يرفع فيها مدير ذاكرة Windows الفرعي مساحة الذاكرة الافتراضية. قصير من عدم تخصيص الذاكرة. إذا كنت تكافح الآن مع OOM ، فيجب عليك حقًا التفكير في إعادة تصميم تطبيقك. أو التحول إلى نظام تشغيل 64 بت ، حل مائتي دولار.

نصائح أخرى

إجابة قصيرة: لا. تحتاج إلى الاستفادة من واجهة برمجة تطبيقات Win32 لذلك. أنا حقًا لا أعرف ما الذي تتصل به API الذي ستستخدمه على الرغم من ...

بحث سريع في http://www.pinvoke.net قادني إلى هذا:

[DllImport("coredll.dll", SetLastError=true)]
static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);

لكن يبدو أن هيكل MemoryStatus يحتوي على جميع المعلومات التي تحتاجها (فقط استخدام الذاكرة الفعلي والافتراضية وغيرها من المعلومات).

يجب عليك الحفر حول MSDN للعثور على الطريقة اللازمة.

مثل هذه المكالمة لا معنى لها في العالم المدارة ، لأن مضيفي CLR المختلفون قد يتعاملون مع الأشياء بشكل مختلف (مثل مضيف التطبيق العادي أو خادم SQL). ولا تنسى أن GC يمكنه تحريك الأشياء ، بحيث لا يمثل التجزئة مشكلة في الحقيقة هي أن GC يضغط على الكومة.

ومع ذلك ، فإن هذا يقودني إلى النقطة التالية ، يجب أن تكون قادرًا على الحصول على هذه المعلومات من خلال استضافة CLR بنفسك. قد ترغب في النظر إلى هذا المدونة نشر حول هذا الموضوع.

عليك حقًا الوصول إلى واجهة برمجة تطبيقات Win32/Win64 للحصول على هذه المعلومات على مستوى الصفحة. أي أكثر تفصيلاً وتحتاج إلى معرفة الأعمال الداخلية لأي كومة تنظر إليها ، سواء أكان كومة C أو Win32 أو كومة كائن صغير CLR أو كومة كائنات كبيرة CLR.

ومع ذلك يمكنك استخدام التحقق من الذاكرة الافتراضية (وهو تجاري ، ولكن مجاني) لتصور مساحة الذاكرة الافتراضية ، وكذلك فحص صفحة مساحة الذاكرة حسب الصفحة والفقرة حسب الفقرة. انظر إلى الصور المرئية أولاً لأن ذلك يجعل من السهل رؤية المشاكل والاتجاهات العامة. ثم انظر إلى المعلومات التفصيلية حول الصفحات والفقرات عندما تقرر ما هي مناطق الذاكرة مشكلة.

إليك مقالة مدونة تصف ماذا الصفحات والفقرات نكون.

في C يمكنك كتابة شيء مثل هذا لمعرفة مقدار الذاكرة المخصصة:

HANDLE heap = GetProcessHeap();
PROCESS_HEAP_ENTRY entry;
memset(&entry, 0, sizeof(entry));
unsigned long size = 0;
while(HeapWalk(heap, &entry)) {
    if(entry.wFlags & PROCESS_HEAP_ENTRY_BUSY) {
        size += entry.cbData;
    }
}

قد تكون هناك حاجة إلى GetProcessheaps () إذا تم استخدام أكوام أخرى في هذه الحالة تحتاج إلى حلقة ثانية لتخوض جميع النواة. لا أعرف لماذا سيكون أكثر من واحد.

في حالتك ، ربما يجب أن تحسب عدد الكتل وأحجامها. إذا كنت ترغب في حفظ ذلك للقرص ، أقترح عليك أولاً حساب عدد الكتل ، وقم بتخصيص مخزن مؤقت لحفظ جميع المعلومات ، ثم حفظ المخزن المؤقت في ملف للمراجعة اللاحقة.

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