Certain data bindings cause a memory leak during the lifetime of a desktop if templates are re-rendered from a listmodel with template e.g. in <listbox> or <forEach> component.
run the attached example method-binding-leak.zul
1) take a heap dump to count the number of TrackerNodeImplEx-instances
2) click the button to replace objects in the model
3) take another heap dump to compare the number of instances
4) eventually reload screen to destroy the desktop
number of instances before: TrackerNodeImplEx 22
number of instances after 1st click: TrackerNodeImplEx 26
number of instances after 2nd: TrackerNodeImplEx 30
number of instances after 3nd: TrackerNodeImplEx 34
number of instances after reload: TrackerNodeImplEx 22
constant number of TrackerNodeImplEx instances
The attachment contains several workarounds that don't have this problem.
The combination of @load(vm.model) and an EL containing a method call @load(vm.getTitleForItem(each)) cause this memory leak during the lifetime of a desktop. After a desktop cleanup the leaked memory gets GCed again.
bind the model using @init(vm.model) or avoid method calls in EL expressions and rely on bean properties @load(each.property) inside the template.