Thanks for your answer alex, I could change my app to create widgets only once and switch their contents... But sometimes the widgets are created dinamically, i.e. depending on the result of some service.
Do you have any suggestion on this example: - create widget W and its elements (labels, buttons, etc) - call service S - receive n objects from service S - for each object received create a grid that displays some data I'll start making some test with this case... but I'm afraid that the memory of the browser will rise forever. It's really important for me to use the application _at least_ 8 hours without failing... On Oct 23, 1:35 am, "alex.d" <[EMAIL PROTECTED]> wrote: > The Problem is: you can't predict when the browsers garbage collector > will do it's job and you can't trigger it. Try to reduce removing/ > creating widgets but rather switching their's content(for example > label's text or similar). > > On 21 Okt., 23:24, David Ojeda <[EMAIL PROTECTED]> wrote: > > > 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/... > > (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("Leakexample")); > > > 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 -~----------~----~----~----~------~----~------~--~---
