The SVN version of Prototype (1.5.0_pre1) seems to leak every element passed to $, ie. practically everything.
Verified using Drip-0.3 from http://www.outofhanwell.com/ieleak/
Test script:
<html>
<head>
<title>Leak tester</title>
<script src="prototype.js" language="javascript"></script>
<script language="javascript">
function load() {
var i;
var fragment = document.createDocumentFragment();
for(i = 0; i < 500; i++) {
var el = document.createElement("span");
el.appendChild(document.createTextNode(i.toString()+ " "));
fragment.appendChild($(el));
}
document.body.appendChild(fragment);
}
</script>
</head>
<body onload="load()">
</body>
</html>
General memory usage increases roughly 60 times (!) with Prototype enabled, for 25M of memory Prototype can create 500 elements, while normal DOM methods yield 30000 elements. According to Drip, every element passed to $/Element.extend is leaked.
Reason: Element.extend creates a function closure that contains a reference to the element itself and stores it in the element's expando properties, creating a circular reference.
Culprit: (from dom.js)
element[property] = value.bind(null, element);
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ietechcol/dnwebgen/ie_leak_patterns.asp for general advice, the method used by Prototype to extend elements is practically the first leak example there.
Fix: Remove Element.extend? Besides leaking it uses too much memory in any case due to the expando properties.