This post is about Perl, Mason, memory leaks and hunting them easily in objects oriented applications based on these technologies.
It's not a secret that you can cause a memory leak by introducing a cycle with references. It often happens in tree structures when parent holds references on all its children and each child references its parent.
Perl has references weakening that helps avoid most of problems or you can ask people to call a method to destroy structure. Developers who post modules on the CPAN usually aware of the solutions and cover this. However, it can be done differently and it's easy to overlook in the doc.
For a long time I was using different modules to catch leaks, for example Devel::Leak::Object. It's really a useful module, but I used with custom patches for better diagnosis.
Recently had to look into leaks once again and started to wonder how to find a leak that is not reproducible on my machine, but a customer see it and can not say which request cause it. Looked at the CPAN again. Found Devel::LeakGuard::Object, new reincarnation of Devel::Leak::Object with additional ways to instrument reporting.
It was very easy to write a simple memory leaks tracer for mason based applications as a mason plugin. At this moment it helped me identify three small memory leaks in Request Tracker software just by enabling this new module in my devolpment environment. Leaks just poped up in logs during testing of things.
I hope that MasonX::LeakGuard::Object can help other people as well.
Devel::Events::Objects provides scoped instrumenting, that's how Catalyst::Plugin::LeakTracker is implemented
ReplyDeleteSaw some references on that, but decided to stick with something I know and know that it provides not more then I need. Have to make something that doesn't slow down production really bad.
ReplyDeleteAnyway, have to look some day into Devel::Events::Objects.