如何测量 DXL 脚本的内存消耗?
How to measure memory consumption of DXL script?
甚至在您 运行 陷入严重麻烦之前,查明您的脚本是否有严重的内存泄漏可能会很有趣。不幸的是,我无法找到如何测量当前 stack/heap 大小或 "string table" 大小(请参阅 http://www.smartdxl.com/content/?p=481)。有人可以帮忙吗?
相关问题:Predicting DXL Memory and CPU Usage
我找到了问题 "string table" 部分的解决方案。 Mathias Mamsch 在 https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014886977 处提供了一个文件 "stringTable.inc",它定义了函数 printStringTable()
。显然,它输出有关 table 大小的信息,并且可以轻松修补以提供字符串 table 字节大小的近似值。
最大内存"leak" 将是不再使用的打开模块。所以你当然应该关闭那些。
接下来您希望将新字符串的生成保持在最低限度,因为每个新字符串都会在字符串中创建一个条目 table。您可以在此处找到 Mathias Mamsch 关于此的优秀论文:https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014886977&ps=25
最后,具有 create/delete 方法的数据类型如果不被删除会耗尽内存。为了查找未发布的实例,我使用了一些最初由 Mathias Mamsch 创建的记忆函数。 link 我已经回到他的 post 不再有效,但这里是我使用的功能:
//< 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)
}
我很确定我更改了原始 posted 代码中的函数和变量名称,所以如果您遇到他的原始代码,请注意这一点。并且不要问我关于硬编码数字的问题......Mathias 在 post 中解释了它们,我不记得解释了。
代码的使用方法如下:
//< 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
*/
甚至在您 运行 陷入严重麻烦之前,查明您的脚本是否有严重的内存泄漏可能会很有趣。不幸的是,我无法找到如何测量当前 stack/heap 大小或 "string table" 大小(请参阅 http://www.smartdxl.com/content/?p=481)。有人可以帮忙吗?
相关问题:Predicting DXL Memory and CPU Usage
我找到了问题 "string table" 部分的解决方案。 Mathias Mamsch 在 https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014886977 处提供了一个文件 "stringTable.inc",它定义了函数 printStringTable()
。显然,它输出有关 table 大小的信息,并且可以轻松修补以提供字符串 table 字节大小的近似值。
最大内存"leak" 将是不再使用的打开模块。所以你当然应该关闭那些。
接下来您希望将新字符串的生成保持在最低限度,因为每个新字符串都会在字符串中创建一个条目 table。您可以在此处找到 Mathias Mamsch 关于此的优秀论文:https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014886977&ps=25
最后,具有 create/delete 方法的数据类型如果不被删除会耗尽内存。为了查找未发布的实例,我使用了一些最初由 Mathias Mamsch 创建的记忆函数。 link 我已经回到他的 post 不再有效,但这里是我使用的功能:
//< 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)
}
我很确定我更改了原始 posted 代码中的函数和变量名称,所以如果您遇到他的原始代码,请注意这一点。并且不要问我关于硬编码数字的问题......Mathias 在 post 中解释了它们,我不记得解释了。
代码的使用方法如下:
//< 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
*/