كيف يمكنني معرفة مقدار من مساحة عنوان التطبيق يستهلك تقرير هذا المستخدم ؟
-
01-07-2019 - |
سؤال
أنا أكتب من الذاكرة مدير التطبيق ، كجزء من فريق من عشرين ونيف المبرمجون.نحن نفاد الذاكرة الحصص ونحن بحاجة إلى أن تكون قادرا على رؤية ما يحدث منذ تظهر فقط إلى استخدام حوالي 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 لعرض الرعب الحقيقي من الوضع ، و نفهم كيف أنه من الصعب في الواقع بدقة تتبع كل شيء.