embed python如何得知python占用的内存呢?
答案是:不可知的。这就是embed python不如lua的地方,lua不仅可以通过collectgarbage("count")来得到占用内存
还可以传入自定义的lua_Alloc函数分配器:
lua_State *lua_newstate (lua_Alloc f, void *ud);
embed python只能去感知他占用的内存大小,比如在程序退出时,把自己的对象全部销毁了,剩下的大概就是python占用的内存。
如果就此止步不是我们的风格,我们直接重写malloc和free
int g_py_malloc = 0; PyAPI_FUNC(int) py_get_memory_cost() { return g_py_malloc; } void *py2_malloc(unsigned int num_bytes) { void* p = malloc(num_bytes + 4); int* size = (int*)p; *size++ = num_bytes; g_py_malloc += num_bytes; return size; } void *py2_realloc(void* p,unsigned int num_bytes) { int* size; int sz; if (p == 0) return py2_malloc(num_bytes); size = (int*)p; sz = *--size; p = realloc(size,num_bytes+4); size = (int*)p; *size++ = num_bytes; g_py_malloc += num_bytes - sz; return size; } void py2_free(void* p) { int* size; if (p == 0) return; size = (int*)p; g_py_malloc -= *--size; free(size); }
解释一下做法,就是多分配1个int在内存头记录分配的大小即可。
然后把python中的obmalloc.c 和 pymem.h中的malloc,realloc,free分别替换为新的,改动不大可以接受。注意:也许在多线程下有bug。