Fix memory leak in Element.removeData()
#1077
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Prior to this change,
Element.removeData()
replaces an element's data with an empty object. This behavior results in a slow memory leak for applications that do not re-use IDs, as Raphael continues to add new keys and objects toeldata
over time.This memory leak turns out to be a problem for Piwik, which uses
kartographer.js (which uses raphael) to draw an SVG image of the United States
in its dashboard (see demo).
Every time the dashboard is redrawn, it spawns ~700 new Elements with data. I've submitted a pull request that appropriately cleans up this data when the user navigates away from the page using
removeData
, but Raphael leaves an empty object in theeldata
map keyed on the element's old ID. Since kartographer/Piwik does not reuse IDs,eldata
grows continually on each redraw until the application is out of memory.