blazesds consuming huge memory

2019-09-16 15:16发布

BlazeDS 4 is used to communicate with Flex4.6. When flex client invokes a remote call on blazeds server, server returns an arrayList containing POJOs. Assuming each POJO mem size is 12 bytes, I am expecting the arrayList size to be 12*number of elements. However, I find that somewhere in blazeds, it is compounded multiple times. Assuming I add 200000 POJOs into the array list, I am expecting its size to be ~2MB. But, I could see through profilers, that JVM shoots up N times of original size and the same N times mem is being transfered to the flex browser application also. Below listed is a sample code that demonstrates the problem, with jmap profiler captures. I would be happy to provide the flex code also if needed.

    List list = new ArrayList();
for(i=0;i<200000;i++)
{ SampleClass  sampleClassObj = new SampleClass();
  sampleClassObj.setId(1);
  sampleClassObj.setAge(20);
  list.add(sampleClassObj);
} 
return list;

And the SampleClass class definition is as follows

public class SampleClass
{
    long id;
    int age;
    // getters and setters for each variables
}

Memory is profiled in jmap.exe which resides in jdk path. The intitail memory in JVM before recieving a request from client was ~50MB. The output from jmap before request from client.

num  #instances   #bytes   class name
1   63135    8497488   constMethodKlass
2   65671    7858440   [C
3   91344    5217976   symbolKlass
.
.
total  658429    50097416  //initial memory in JVM

The output from jmap after processing request.

num  #instances   #bytes   class name
1   11402    20225512   [B
2   200000    1948809   SampleClass //as expected to be ~2MB
3   62734    8451040   constMethodKlass
.
.
total  1175132    93938272  //consumed memory in JVM which is not garbage collected.

Strange enough, when I try to invoke the same method from Flex repeatedly, the JVM memory does not correspondingly increase. It is only the first time multifold increase that is seen in JVM. However, the flex client application memory keeps increasing for every call.

I even tried running the same on YourKit profiler and tried invoking GC multiple times in vain.

Can someone please make me understand what is going on within blazeds.

1条回答
一夜七次
2楼-- · 2019-09-16 15:45

In default ArrayList capacity is 10 objects, after your adding new object if current capacity is over, your list increase self capacity in 50% of current capacity. Maybe this is reason of memory liks. Try to read this docs http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

查看更多
登录 后发表回答