كيف يمكنني معرفة مقدار من مساحة عنوان التطبيق يستهلك تقرير هذا المستخدم ؟

StackOverflow https://stackoverflow.com/questions/90940

سؤال

أنا أكتب من الذاكرة مدير التطبيق ، كجزء من فريق من عشرين ونيف المبرمجون.نحن نفاد الذاكرة الحصص ونحن بحاجة إلى أن تكون قادرا على رؤية ما يحدث منذ تظهر فقط إلى استخدام حوالي 700Mb.أنا بحاجة إلى أن تكون قادرة على تقديم تقرير إلى أين ذاهب - تجزئة الخ.أي أفكار ؟

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

المحلول

يمكنك استخدام الذاكرة القائمة أدوات التصحيح لـ هذا ، وجدت الذاكرة مدقق 1 مفيدة جدا, أنها قادرة على تتبع كل مستوى API (كومة جديدة...) و مستوى نظام التشغيل (الذاكرة الظاهرية) مخصصات وتظهر الذاكرة الظاهرية الخرائط.

الخيار الآخر الذي وجدت أيضا مفيدة جدا هو أن تكون قادرة على تفريغ خريطة كاملة الفضاء الافتراضي على أساس VirtualQuery وظيفة.بلدي رمز هذا يبدو مثل هذا:

void PrintVMMap()
{
  size_t start = 0;
  // TODO: make portable - not compatible with /3GB, 64b OS or 64b app
  size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
  SYSTEM_INFO si;
  GetSystemInfo(&si);
  size_t pageSize = si.dwPageSize;
  size_t longestFreeApp = 0;

  int index=0;
  for (size_t addr = start; addr<end; )
  {
    MEMORY_BASIC_INFORMATION buffer;
    SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
    if (retSize==sizeof(buffer) && buffer.RegionSize>0)
    {
      // dump information about this region
      printf(.... some buffer information here ....);
      // track longest feee region - usefull fragmentation indicator
      if (buffer.State&MEM_FREE)
      {
        if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
      }
      addr += buffer.RegionSize;
      index+= buffer.RegionSize/pageSize;
    }
    else
    {
      // always proceed
      addr += pageSize;
      index++;
    }
  }
  printf("Longest free VM region: %d",longestFreeApp);
}

نصائح أخرى

يمكنك أيضا العثور على معلومات عن أكوام في عملية Heap32ListFirst/Heap32ListNext ، عن الوحدات النمطية المحملة مع Module32First/Module32Next من أداة مساعدة API.

'أداة مساعدة' نشأت على ويندوز 9x.العملية الأصلية المعلومات API Windows NT كان PSAPI الذي يوفر الوظائف التي جزئيا (ولكن ليس تماما) تتداخل مع أداة المساعدة.

لدينا (ضخمة) التطبيق (Win32 اللعبة) بدأ رمي "لا يكفي الكوتا" الاستثناءات في الآونة الأخيرة ، وأنا اتهم معرفة أين كل ذكرى كان يحدث.أنها ليست تافهة العمل على هذا السؤال ، هذا واحد كانت أول المحاولات في معرفة.كومة سلوك غير متوقع بدقة تتبع مقدار الحصص التي استخدمتها وكم هو متاح حتى الآن مستحيلا.في الواقع, انها ليست مفيدة بشكل خاص المعلومات على أي حال - "الكوتا" و "في مكان لوضع الأشياء" هي بمهارة و مزعج مفاهيم مختلفة.الجواب المقبول هو جيدة كما يحصل, على الرغم من أن تعداد أكوام وحدات هي أيضا في متناول اليد.اعتدت DebugDiag من MS لعرض الرعب الحقيقي من الوضع ، و نفهم كيف أنه من الصعب في الواقع بدقة تتبع كل شيء.

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