Forgot to mention some things: sIEve indicates that there are no memory leaks. However, it does show that there are unused DOM nodes (it also says they are orphaned). It seems these nodes are always an instance of the label.
I understand that I am creating a new Label, and hence a new dom node, every time the user clicks the button. However, shouldn't it be garbage collected after I remove it from the panel? That's my main question... GWT docs indicate that they solve the circular reference problem and is very careful with memory leaks... but this simple example tells me otherwise. I really wish that I was wrong about this. Here is the info of one of the unused dom nodes according to sIEve: http://192.168.1.100:8080/TestGWT-1.0-SNAPSHOT/testgroup.Application/Application.html (1 reference) language scrollHeight 0 isTextEdit 0 currentStyle [object] document [object] onmouseup oncontextmenu isMultiLine -1 clientHeight 0 onrowexit onbeforepaste onactivate scrollLeft 0 lang onmousemove onmove onselectstart parentTextEdit [null object] oncontrolselect canHaveHTML -1 onkeypress oncut onrowenter onmousedown onpaste className gwt-Label id onreadystatechange onbeforedeactivate hideFocus 0 dir isContentEditable 0 onkeydown clientWidth 0 onlosecapture parentElement [null object] ondrag ondragstart oncellchange recordNumber onfilterchange onrowsinserted ondatasetcomplete onmousewheel ondragenter onblur onresizeend onerrorupdate onbeforecopy ondblclick scopeName HTML onkeyup onresizestart onmouseover onmouseleave outerText this is a new label 66 innerText this is a new label 66 onmoveend tagName DIV title offsetWidth 0 onresize contentEditable inherit runtimeStyle [object] filters (unknown) ondrop onpage onrowsdelete tagUrn offsetLeft 0 clientTop 0 style [object] onfocusout clientLeft 0 ondatasetchanged canHaveChildren -1 ondeactivate isDisabled 0 onpropertychange ondragover onhelp ondragend onbeforeeditfocus disabled 0 onfocus behaviorUrns [object] accessKey onscroll onbeforeactivate onbeforecut readyState complete all [object] sourceIndex 0 onclick scrollTop 0 oncopy onfocusin tabIndex 0 onbeforeupdate outerHTML <DIV class=gwt-Label __sIEve_hookedNode="true" __listener="null">this is a new label 66</DIV> innerHTML this is a new label 66 ondataavailable offsetHeight 0 onmovestart onmouseout scrollWidth 0 offsetTop 0 onmouseenter onlayoutcomplete offsetParent [null object] onafterupdate ondragleave children [object] parentNode [object] ownerDocument [object] firstChild [object] lastChild [object] childNodes [object] nextSibling [null object] align dataFormatAs dataSrc nodeName DIV noWrap 0 nodeValue nodeType 1 previousSibling [null object] attributes [object] dataFld cloneNode [object] __listener On Oct 22, 4:12 pm, David Ojeda <[EMAIL PROTECTED]> wrote: > Hello all, > > I am having some serious problems with a big application that is using > a lot of the browser's memory (Internet Explorer 6 and 7). > It is a single page that constantly > removes/adds widgets to panels, so it doesn't navigate to external > links. It uses a 3rd party lib: gwt-ext, so this is my primary > suspect. > > However, I analyzed the application with sIEve > (http://home.wanadoo.nl/jsrosman/), and I think that removing and > adding widgets dinamycally to panels could be one cause of my > problems. > > I created the following test: > > package testgroup.client; > > import com.google.gwt.core.client.EntryPoint; > import com.google.gwt.user.client.ui.Button; > import com.google.gwt.user.client.ui.ClickListener; > import com.google.gwt.user.client.ui.Label; > import com.google.gwt.user.client.ui.Panel; > import com.google.gwt.user.client.ui.RootPanel; > import com.google.gwt.user.client.ui.SimplePanel; > import com.google.gwt.user.client.ui.Widget; > > public class Application implements EntryPoint { > > private boolean added = false; > private Widget mywidget = null; > private int counter = 0; > > /** > * This is the entry point method. > */ > public void onModuleLoad() { > > final Panel mypanel = new SimplePanel(); > final Button mybutton = new Button("Add or remove label"); > > mybutton.addClickListener(new ClickListener() { > public void onClick(Widget arg0) { > if (added) { > mypanel.remove(mywidget); > mywidget = null; // just in case > } else { > mywidget = new Label("this is a new label "+ > (counter++)); > mypanel.add(mywidget); > } > added = !added; > } > }); > > RootPanel.get().add(new Label("Leak example")); > RootPanel.get().add(mybutton); > RootPanel.get().add(mypanel); > } > > } > > When testing with sIEve, it says that this generates 38 DOM nodes and > ~7512 kb of memory. Every time I click the button in order to add a > label to the panel, a new DOM node is created and the memory increases > by some kb (sometimes 4kb, 20kb, I don't see a pattern). But when I > click again > to remove it, neither the number of DOM nodes decreases nor the > memory. > > What is going on here? > > I also tested with a timer: > > Timer timer = new Timer() { > public void run() { > if (added) { > mypanel.remove(mywidget); > mywidget = null; // just in case > } else { > mywidget = new Label("this is a new label "+ > (counter++)); > mypanel.add(mywidget); > } > added = !added; > } > }; > timer.scheduleRepeating(500); > > But in this case, the DOM and memory are stable! > I am really confused here, this is obviously not my application, but > my application does a lot of add/remove of much more complicated > widgets that consume some space. > > I am using GWT-1.4.61, but the same behaviour is happening with 1.5.2. > > Please, does anyone have any ideas on this? > > Thanks > > David --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/Google-Web-Toolkit?hl=en -~----------~----~----~----~------~----~------~--~---
