Description
Environment
- Pythonnet version: 3.0.0
- Python version: 3.7.4
- Operating System: Windows 10
- .NET Framework 4.8.4515.0
Details
- There appears to be a memory leak when attaching a method to an event handler from Python. I was able to break this down into a very simple example. Below is my C# Library
using System;
namespace MemoryLeak
{
public Class MemoryLeak : IDisposable
{
public event EventHandler LeakEvent;
public MemoryLeak()
{
GC.Collect();
Console.WriteLine(GC.GetTotalMemory(true));
}
public void Dispose()
{
this.LeakEvent = null;
}
}
}
(This was the file in my C# class library, just built and took the DLL to use in the below python script)
and the python script that utilizes this library:
import gc
import sys
import clr
def main():
sys.path.append("./dlls") # the dll from the above class library is stored here
clr.AddReference("MemoryLeak")
import System
from MemoryLeak import MemoryLeak
def event_handler():
pass
for _ in range(200):
example = MemoryLeak()
example.LeakEvent += event_handler
example.LeakEvent -= event_handler
example.Dispose()
del example
gc.collect()
System.GC.Collect()
if __name__ == "__main__":
main()
If you run this python script successfully, you will notice that the total memory steadily increases. If you simply remove the following two lines from the python script regarding the addition of the event handler into the C# object, you will notice no memory increase:
example.LeakEvent += event_handler
example.LeakEvent -= event_handler
I would expect that between the cleanup of the attached handler, disposal and manual collections from both python and C#, that the event handler + memory leak class would get garbage collected properly, but they do not appear to be removed entirely based on memory tracking.
To note, I did attempt to make a C# console application that performs the same steps as the python script and the memory did not leak in that example.
I am more than happy to help contribute if this is deemed to be an issue with pythonnet, but would need a little guidance on where to start.