2015-06-03 2 views
1

Если вы обнаружите, что ваш сценарий имеет значительную утечку памяти, может быть интересен даже до того, как вы столкнетесь с серьезными проблемами. К сожалению, мне не удалось выяснить, как измерить текущий размер стека/кучи или размер «строковой таблицы» (см. http://www.smartdxl.com/content/?p=481). Может ли кто-нибудь помочь?Как измерить потребление памяти сценария DXL?

Связанный вопрос: Predicting DXL Memory and CPU Usage

ответ

1

Самая большая утечка памяти - это открытые модули, которые больше не используются. Поэтому, конечно, вы должны закрыть их.

Далее вы хотите свести производство новых строк к минимуму, так как каждый новый создает запись в таблице строк. Вы можете найти отличную диссертацию по этому вопросу от Mathias Mamsch здесь: https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014886977&ps=25

Наконец, типы данных, которые имеют методы создания/удаления, могут потреблять память, если они не удаляются. Чтобы найти неизданные экземпляры, я использую некоторые функции памяти, созданные Mathias Mamsch. Ссылка я должен вернуться на свой пост уже не работает, но вот те функции, которые я использую:

//< Memory Functions [Memory.inc] 
/* 
Code adapted from forum post by Mathias Mamsch: 
https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014830975 
*/ 

int *::+(int *ptr, int ofs) 
{ 
    int *rtn = ptr 
    rtn += ofs 
    return(rtn) 
} 

int *::@(int *ptr, int ofs) 
{ 
    int adr = *(ptr + ofs) 
    int *rtn = addr_(adr) 
    return(rtn) 
} 

int *mbn(int *ptr) 
{ 
    return(ptr @ 0x74) 
} 

int *nnn(int *ptr) 
{ 
    return(ptr @ 8) 
} 

int *ccp() 
{ 
    DB db = create("") 
    int *ptr = addr_(db) 
    int *rtn = ptr @ 48 
    destroy(db) 
    return(rtn) 
} 

int allocatedObjects() 
{ 
    int cnt = 0 
    int *mb = mbn(ccp()) 
    while(!null mb) { mb = nnn(mb) ; cnt++ } 
    return(cnt) 
} 

Я уверен, что я изменил функцию и имена переменных из оригинала размещен код, так что будьте в курсе что если вы когда-нибудь столкнетесь с его оригинальным кодом. И не спрашивайте меня о жестко закодированных номерах ... Матиас объяснил их на этом посту, и я не помню объяснения.

Вот как вы будете использовать код:

//< Test of Memory.inc 
/* 
*/ 
pragma encoding, "UTF-8" 

#include <stdlib/Memory.inc> 

pragma runLim, 0 

int numallobj = allocatedObjects() 
print numallobj "\n" 

Skip skp = null Skip 

numallobj = allocatedObjects() 
print numallobj "\n" 

skp = create() 

numallobj = allocatedObjects() 
print numallobj "\n" 

delete(skp) 

numallobj = allocatedObjects() 
print numallobj "\n" 

/* 
Output should be: 
0 
0 
1 
0 
*/ 
0

Я нашел решение для «строки таблицы» части вопроса. Mathias Mamsch предоставляет файл «stringTable.inc» в https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014886977, который определяет функцию printStringTable(). По-видимому, он выводит информацию о размере таблицы и может быть легко исправлен, чтобы обеспечить приближение байта таблицы строк.