Eryk Sun added the comment:
The leak is due the pointer-type cache that ctypes.POINTER uses. The type the
pointer refers to is used as the key. In this case, VS_FIXEDFILEINFO is created
each time win32_ver is called, so the pointer-type cache grows without bound.
Example leak:
>>> import psutil, platform
>>> proc = psutil.Process()
>>> proc.memory_info().rss
14704640
>>> for i in range(10000):
... v = platform.win32_ver()
...
>>> proc.memory_info().rss
92704768
>>> for i in range(10000):
... v = platform.win32_ver()
...
>>> proc.memory_info().rss
168861696
Clearing the cache followed by a collect() reclaims the leaked memory for the
most part:
>>> import gc, ctypes
>>> gc.collect()
333
>>> proc.memory_info().rss
168849408
>>> ctypes._pointer_type_cache.clear()
>>> gc.collect()
740000
>>> proc.memory_info().rss
20303872
It's a moot point, since Steve plans to re-implement this check in C, but the
minimal change to fix this leak is to bypass the pointer-type cache by manually
subclassing ctypes._Pointer:
class PVS_FIXEDFILEINFO(_Pointer):
_type_ = VS_FIXEDFILEINFO
pvi = PVS_FIXEDFILEINFO()
There's no more leak after this change:
>>> import psutil, platform
>>> proc = psutil.Process()
>>> proc.memory_info().rss
15450112
>>> for i in range(10000):
... v = platform.win32_ver()
...
>>> proc.memory_info().rss
16592896
>>> for i in range(10000):
... v = platform.win32_ver()
...
>>> proc.memory_info().rss
16601088
----------
nosy: +eryksun
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue27932>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com