Title: Memory leak when attaching event handlers from Python · Issue #1972 · pythonnet/pythonnet · GitHub
Open Graph Title: Memory leak when attaching event handlers from Python · Issue #1972 · pythonnet/pythonnet
X Title: Memory leak when attaching event handlers from Python · Issue #1972 · pythonnet/pythonnet
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...
Open Graph 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 handl...
X 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 handl...
Opengraph URL: https://github.com/pythonnet/pythonnet/issues/1972
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Memory leak when attaching event handlers from Python","articleBody":"### Environment\r\n\r\n- Pythonnet version: 3.0.0\r\n- Python version: 3.7.4\r\n- Operating System: Windows 10\r\n- .NET Framework 4.8.4515.0\r\n\r\n### Details\r\n\r\n- 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\r\n\r\n```c#\r\nusing System;\r\n\r\nnamespace MemoryLeak\r\n{\r\n public Class MemoryLeak : IDisposable\r\n {\r\n public event EventHandler LeakEvent;\r\n public MemoryLeak()\r\n {\r\n GC.Collect();\r\n Console.WriteLine(GC.GetTotalMemory(true));\r\n }\r\n public void Dispose()\r\n {\r\n this.LeakEvent = null;\r\n }\r\n }\r\n}\r\n```\r\n\r\n(This was the file in my C# class library, just built and took the DLL to use in the below python script)\r\n\r\nand the python script that utilizes this library:\r\n\r\n```python\r\nimport gc\r\nimport sys\r\n\r\nimport clr\r\n\r\ndef main():\r\n sys.path.append(\"./dlls\") # the dll from the above class library is stored here\r\n clr.AddReference(\"MemoryLeak\")\r\n\r\n import System\r\n\r\n from MemoryLeak import MemoryLeak\r\n\r\n def event_handler():\r\n pass\r\n\r\n for _ in range(200):\r\n example = MemoryLeak()\r\n example.LeakEvent += event_handler\r\n example.LeakEvent -= event_handler\r\n example.Dispose()\r\n del example\r\n gc.collect()\r\n System.GC.Collect()\r\n\r\nif __name__ == \"__main__\":\r\n main()\r\n```\r\n\r\nIf 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:\r\n```python\r\n example.LeakEvent += event_handler\r\n example.LeakEvent -= event_handler\r\n```\r\n\r\nI 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. \r\n\r\nTo 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.\r\n\r\nI 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.\r\n\r\n","author":{"url":"https://github.com/sean-marten","@type":"Person","name":"sean-marten"},"datePublished":"2022-10-13T00:07:00.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6},"url":"https://github.com/1972/pythonnet/issues/1972"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:123e082d-0480-de79-bd64-68a16bec54ab |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 83C8:19E8FE:134B5F9:19D773D:69706288 |
| html-safe-nonce | d07797a7f594d183247542c86c63ed18d467d13aafefb2d701892036c19cfef8 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4M0M4OjE5RThGRToxMzRCNUY5OjE5RDc3M0Q6Njk3MDYyODgiLCJ2aXNpdG9yX2lkIjoiNTQxNTYwNDAzNTcyMjk2MTU0NCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 5fafc660d013205f7471b0cbdcbfc30bf2389ee380d7a21779ee7ca79dc5143b |
| hovercard-subject-tag | issue:1406945162 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/pythonnet/pythonnet/1972/issue_layout |
| twitter:image | https://opengraph.githubassets.com/eabdd7c083c41f6f8797681f8975848568990c3445770571e4fea3158655d0f7/pythonnet/pythonnet/issues/1972 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/eabdd7c083c41f6f8797681f8975848568990c3445770571e4fea3158655d0f7/pythonnet/pythonnet/issues/1972 |
| og:image:alt | 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 handl... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | sean-marten |
| hostname | github.com |
| expected-hostname | github.com |
| None | 9920a62ba22d06470388e2904804fb7e5ec51c9e35f81784e9191394c74b2bd2 |
| turbo-cache-control | no-preview |
| go-import | github.com/pythonnet/pythonnet git https://github.com/pythonnet/pythonnet.git |
| octolytics-dimension-user_id | 6050430 |
| octolytics-dimension-user_login | pythonnet |
| octolytics-dimension-repository_id | 14748123 |
| octolytics-dimension-repository_nwo | pythonnet/pythonnet |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 14748123 |
| octolytics-dimension-repository_network_root_nwo | pythonnet/pythonnet |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7d6181066430cc06553c8396ca201e194ae33cb9 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width