0

Memory usage in ZK

asked 2012-09-21 07:14:57 +0800

Marky gravatar image Marky flag of Spain
284 7
http://www.no/havent-doma...

Hi forum!!

I have been some years working with ZK software, and I try to document this problem searching an answer, but it was unsuccessful.
The main problem is the memory usage when I’m working with the application with a listbox (huge). I have a lot of records to draw into listbox, but always that I do some action in my application the memory usage increases (paging, open in windows and then closing them, etc).

I have tried different options to configure the listbox, even create my own paging to control how many rows are created, but there aren’t any way to solve it, all is useless.
I have used the MAT to try look the problem, and I could see that the problem is the created objects (listcells, listitems, etc). Is that true? After read a lot of it in this forum I note that this is a usual problem into the ZK community and will be good to solve it as soon as possible. Its possible that I’m doing some wrong, then I put a example to see it.
ZK version: 6.0
Tomcat: v.7

This is my listbox (Javaclass):

public class ListBoxMemory extends SelectorComposer<Component> {

	private static final long serialVersionUID = 1L;
	@Init
	public void init(@ContextParam(ContextType.VIEW) Component view){
		Selectors.wireComponents(view, this, false);
		Selectors.wireEventListeners(view, this);
		Selectors.wireVariables(view, this, null);
	}
	
	//The binding list
	private List<MemoryBean> BeanList = new ArrayList<MemoryBean>();
	private MemoryBean bean;
	@Command
	@NotifyChange("*")
	public void Start(){
		//We create the list of bean
		createList();
	}
	
	private void createList(){
		BeanList.clear();
		for(int i = 0; i < 1000; i++){
			bean = new MemoryBean();
			bean.setField1("Field+1+("+i+")");
			bean.setField2("Field+2+("+i+")");
			bean.setField3("Field+3+("+i+")");
			bean.setField4("Field+4+("+i+")");
			bean.setField5("Field+5+("+i+")");
			bean.setField6("Field+6+("+i+")");
			bean.setField7("Field+7+("+i+")");
			bean.setField8("Field+8+("+i+")");
			bean.setField9("Field+9+("+i+")");
			bean.setField10("Field+10+("+i+")");
			bean.setField11("Field+11+("+i+")");
			bean.setField12("Field+12+("+i+")");
			bean.setField13("Field+13+("+i+")");
			bean.setField14("Field+14+("+i+")");
			bean.setField15("Field+15+("+i+")");
			bean.setField16("Field+16+("+i+")");
			bean.setField17("Field+17+("+i+")");
			bean.setField18("Field+18+("+i+")");
			bean.setField19("Field+19+("+i+")");
			bean.setField20("Field+20+("+i+")");
			bean.setField21("Field+21+("+i+")");
			bean.setField22("Field+22+("+i+")");
			bean.setField23("Field+23+("+i+")");
			bean.setField24("Field+24+("+i+")");
			bean.setField25("Field+25+("+i+")");
			bean.setField26("Field+26+("+i+")");
			bean.setField27("Field+27+("+i+")");
			bean.setField28("Field+28+("+i+")");
			
			BeanList.add(bean);
		}
	}

	public List<?> getBeans() {
		return BeanList;
	}
}

Zul page:

<zk>
<window title="LBMemory" border="normal" onCreate="@command('Start')"
 apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('org.sts.Pruebas.PruebasMemoria.ListBoxMemory')" height="100%">
	<listbox id="Listbox" mold="paging" pagingPosition="bottom" span="true"  autopaging="true" width="100%" height="100%"  sizedByContent="true" vflex="true" model="@load(vm.beans)" >
		<template name="model" var="item">
				<listitem value="@load(item)"  >
					<listcell label="@load(item.field1)" ></listcell>
					<listcell label="@load(item.field2)" ></listcell>
					<listcell label="@load(item.field3)" ></listcell>
					<listcell label="@load(item.field4)" ></listcell>
					<listcell label="@load(item.field5)" ></listcell>
					<listcell label="@load(item.field6)" ></listcell>
					<listcell label="@load(item.field7)" ></listcell>
					<listcell label="@load(item.field8)" ></listcell>
					<listcell label="@load(item.field9)" ></listcell>
					<listcell label="@load(item.field10)" ></listcell>
					<listcell label="@load(item.field11)" ></listcell>
					<listcell label="@load(item.field12)" ></listcell>
					<listcell label="@load(item.field13)" ></listcell>
					<listcell label="@load(item.field14)" ></listcell>
					<listcell label="@load(item.field15)" ></listcell>
					<listcell label="@load(item.field16)" ></listcell>
					<listcell label="@load(item.field17)" ></listcell>
					<listcell label="@load(item.field18)" ></listcell>
					<listcell label="@load(item.field19)" ></listcell>
					<listcell label="@load(item.field20)" ></listcell>
					<listcell label="@load(item.field21)" ></listcell>
					<listcell label="@load(item.field22)" ></listcell>
					<listcell label="@load(item.field23)" ></listcell>
					<listcell label="@load(item.field24)" ></listcell>
					<listcell label="@load(item.field25)" ></listcell>
					<listcell label="@load(item.field26)" ></listcell>
					<listcell label="@load(item.field27)" ></listcell>
					<listcell label="@load(item.field28)" ></listcell>
				</listitem>
		</template>
	</listbox>
</window>
</zk>


The bean:

public class MemoryBean {
	
	//Var
	private String Field1 = "";
	private String Field2 = "";
	private String Field3 = "";
	private String Field4 = "";
	private String Field5 = "";
	private String Field6 = "";
	private String Field7 = "";
	private String Field8 = "";
	private String Field9 = "";
	private String Field10 = "";
	private String Field11 = "";
	private String Field12 = "";
	private String Field13 = "";
	private String Field14 = "";
	private String Field15 = "";
	private String Field16 = "";
	private String Field17 = "";
	private String Field18 = "";
	private String Field19 = "";
	private String Field20 = "";
	private String Field21 = "";
	private String Field22 = "";
	private String Field23 = "";
	private String Field24 = "";
	private String Field25 = "";
	private String Field26 = "";
	private String Field27 = "";
	private String Field28 = "";
	
	//Constructor
	public MemoryBean(){
		
	}
	
	
	//Getters
	public String getField1() {
		return Field1;
	}
	public String getField2() {
		return Field2;
	}
	public String getField3() {
		return Field3;
	}
	public String getField4() {
		return Field4;
	}
	public String getField5() {
		return Field5;
	}
	public String getField6() {
		return Field6;
	}
	public String getField7() {
		return Field7;
	}
	public String getField8() {
		return Field8;
	}
	public String getField9() {
		return Field9;
	}
	public String getField10() {
		return Field10;
	}
	public String getField11() {
		return Field11;
	}
	public String getField12() {
		return Field12;
	}
	public String getField13() {
		return Field13;
	}
	public String getField14() {
		return Field14;
	}
	public String getField15() {
		return Field15;
	}
	public String getField16() {
		return Field16;
	}
	public String getField17() {
		return Field17;
	}
	public String getField18() {
		return Field18;
	}
	public String getField19() {
		return Field19;
	}
	public String getField20() {
		return Field20;
	}
	public String getField21() {
		return Field21;
	}
	public String getField22() {
		return Field22;
	}
	public String getField23() {
		return Field23;
	}
	public String getField24() {
		return Field24;
	}
	public String getField25() {
		return Field25;
	}
	public String getField26() {
		return Field26;
	}
	public String getField27() {
		return Field27;
	}
	public String getField28() {
		return Field28;
	}

	//Setters
	public void setField1(String field1) {
		Field1 = field1;
	}
	public void setField2(String field2) {
		Field2 = field2;
	}
	public void setField3(String field3) {
		Field3 = field3;
	}
	public void setField4(String field4) {
		Field4 = field4;
	}
	public void setField5(String field5) {
		Field5 = field5;
	}
	public void setField6(String field6) {
		Field6 = field6;
	}
	public void setField7(String field7) {
		Field7 = field7;
	}
	public void setField8(String field8) {
		Field8 = field8;
	}
	public void setField9(String field9) {
		Field9 = field9;
	}
	public void setField10(String field10) {
		Field10 = field10;
	}
	public void setField11(String field11) {
		Field11 = field11;
	}
	public void setField12(String field12) {
		Field12 = field12;
	}
	public void setField13(String field13) {
		Field13 = field13;
	}
	public void setField14(String field14) {
		Field14 = field14;
	}
	public void setField15(String field15) {
		Field15 = field15;
	}
	public void setField16(String field16) {
		Field16 = field16;
	}
	public void setField17(String field17) {
		Field17 = field17;
	}
	public void setField18(String field18) {
		Field18 = field18;
	}
	public void setField19(String field19) {
		Field19 = field19;
	}
	public void setField20(String field20) {
		Field20 = field20;
	}
	public void setField21(String field21) {
		Field21 = field21;
	}
	public void setField22(String field22) {
		Field22 = field22;
	}
	public void setField23(String field23) {
		Field23 = field23;
	}
	public void setField24(String field24) {
		Field24 = field24;
	}
	public void setField25(String field25) {
		Field25 = field25;
	}
	public void setField26(String field26) {
		Field26 = field26;
	}
	public void setField27(String field27) {
		Field27 = field27;
	}
	public void setField28(String field28) {
		Field28 = field28;
	}
}

[

Action - Memory(KB)

Start - 48.748
2nd page - 51.992
14th page - 70.584
Return to 2nd page - 74.232
22nd page - 80.100
10 minutes past -80.172

Conclusion:
The memory usage by java process always rises when I paging and never decrease. Increase the server’s memory is the only way to solve it?

Please, I will be very grateful if we could solve this problem.
Thanks for all,
Regards,
Marky

delete flag offensive retag edit

24 Replies

Sort by » oldest newest

answered 2012-09-27 10:40:08 +0800

Marky gravatar image Marky flag of Spain
284 7
http://www.no/havent-doma...

@Dieter
Thanks to respond. I would implement my own paging but I have a problem. The problem is that my paging needs how many rows fit in the listbox. This number can be get before the load and drow, but i haven't got control in this moment.
This happens because the window or another container is resizable (I know that if the container hasn't the problem disappears).
If we have some way to calculate this number maybe we can solve this problem.
Any idea?
Regards,
Marky.

link publish delete flag offensive edit

answered 2012-09-27 12:25:14 +0800

dis gravatar image dis flag of Switzerland
140 4

Hi Marky

We tried the same and found that it's not easy to calculate the best page size. Even if possible, we did not like odd numbers as page size.

So, we decided to implemented a drop down box where the user could choose how many items to render in one page. Depending on the number of items and the size of the listbox, a scrollbar appears (or white space below the list).

Regards
Dieter

link publish delete flag offensive edit

answered 2012-09-27 16:28:03 +0800

Marky gravatar image Marky flag of Spain
284 7
http://www.no/havent-doma...

Hi dis, thanks for your fast answer :)
I can do this, calculate the space and put one number for beans, but the real problem is the memory. I populate 10 elements or 100 ok, but the memory increases always. However, if I have 10 items and use this to populate 10 next why memory increases?
Regards,
Marky

link publish delete flag offensive edit

answered 2012-09-27 20:27:34 +0800

terrytornado gravatar image terrytornado flag of Germany
9393 3 7 16
http://www.oxitec.de/

I think the JAVA Garbage Collection does not run in 'RealTime' .
http://javarevisited.blogspot.de/2011/04/garbage-collection-in-java.html

link publish delete flag offensive edit

answered 2012-09-28 06:43:51 +0800

Marky gravatar image Marky flag of Spain
284 7
http://www.no/havent-doma...

Hi Stephan,
I read the article and its very interesting. I think while I was reading about the garbage collection why this objects are created and not destroyed.
ZK implements in some way the garbage collector?
Can I implement garbage collector in my ZK project?(like in the pagign event or similar).

Regards,
Marky

link publish delete flag offensive edit

answered 2012-09-28 08:05:02 +0800

terrytornado gravatar image terrytornado flag of Germany
9393 3 7 16
http://www.oxitec.de/

I don't think so. The best way seems to have enough memory. Hope others can give you a better help.

best
Stephan

link publish delete flag offensive edit

answered 2012-09-28 08:29:47 +0800

pinods gravatar image pinods
12

@Marky
the garbage collector is implemented by JVM vendor. You can tune it, for example:

but i think the problem is elsewhere. Usually, when the memory usage is around 85-90%, there is an automatic system call to the GC that lets memory free, erasing unused objects. if this not happens, you could have an "OutOfMemoryException". So, the question is: could be the objects in ZK always referred ???

link publish delete flag offensive edit

answered 2012-10-01 13:56:19 +0800

Marky gravatar image Marky flag of Spain
284 7
http://www.no/havent-doma...

I think that this question can be resolved by ZK team.
@terryTornado, who can know this?
Regards,
Marky

link publish delete flag offensive edit

answered 2012-10-16 07:02:01 +0800

Marky gravatar image Marky flag of Spain
284 7
http://www.no/havent-doma...

Some one can guide me? I really want solve it.
I'm investigating about it but I need more information from Zk designers.
Thanks,
Marky.

link publish delete flag offensive edit

answered 2012-10-29 11:21:38 +0800

dennis gravatar image dennis
3679 1 6
http://www.javaworld.com....

1. you should use heap dump tool to see the instance number after you drop the ui, don't just count on os-memory size.
1.1 check if there are any object references causes the memory leak.
2. if you load/new 10000 items and keep the object reference , then it will be there, in memory. if you ZK EE, in component side, ZK will optimize it as possible, however you have still to control your data instance creation.
1.1 implement you own dynamic ListModel to do smart work. and use it in MVVM (don't use java List for huge data, use ListModel)
1.2 if you want to use List in MVVM, then you have to implement your paging, and control the date at same as the page-size.

link publish delete flag offensive edit
Your reply
Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

[hide preview]

Question tools

Follow

RSS

Stats

Asked: 2012-09-21 07:14:57 +0800

Seen: 696 times

Last updated: Oct 30 '12

Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More