BlazeDS 4用于与Flex4.6通信。当flex客户端调用远程调用blazzs服务器,服务器返回一个包含POJO的arrayList。假设每个POJO mem大小为12个字节,我预计arrayList大小为是12*个元素。然而,我发现在某个着火的地方多次复合。假设我将200000个POJO添加到阵列列表中,我预计它的大小约为2MB。但是,我可以透过轮廓仪看到,JVM的大小是原始大小的N倍,而mem的大小是原来的N倍也被传输到flex浏览器应用程序。下面列出的是演示该问题的示例代码,以及jmap探查器捕获。如果需要的话,我很乐意提供弹性代码。
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;
SampleClass类的定义如下
public class SampleClass
{
long id;
int age;
// getters and setters for each variables
}
内存在jmap.exe中进行了分析,jmap.exe位于jdk路径中。JVM中在收到客户端请求之前的初始内存约为50MB。jmap在客户端请求之前的输出。
num#实例#字节;类名
1 63135 8497488;constMethodKlass
2 65671 7858440;[C
3 91344 5217976;symbolKlass
。
。
总计;658429 50097416//JVM中的初始内存
jmap在处理请求后的输出。
num#实例#字节;类名
1 11402 20225512;[B
2 200000 1948809;SampleClass//预计为~2MB
3 62734 8451040;constMethodKlass
。
。
总计;1175132 93938272//JVM中消耗的内存不是垃圾回收的
奇怪的是,当我尝试从Flex重复调用相同的方法时,JVM内存并没有相应地增加。这只是JVM中首次出现倍数增长。但是,flex客户端应用程序内存在每次调用时都会不断增加。
我甚至尝试在YourKit探查器上运行同样的程序,并尝试多次调用GC,但都没有成功。
有人能告诉我大火中发生了什么吗。
默认情况下,ArrayList
的容量为10个对象,添加新对象后,如果当前容量超过,则列表会将自身容量增加到当前容量的50%。也许这就是记忆缺失的原因。尝试阅读此文档http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html