Flex4用于与BlazeDS 4.6通信。当flex client调用blazeds服务器上的远程调用时,服务器返回一个包含POJO的arrayList。假设每个POJO mem大小是12个字节,我期望arrayList大小是12*个元素。然而,我发现在blazeds的某个地方,它被多次混合。假设我将200000个POJO添加到数组列表中,我预计它的大小是~2MB。但是,我可以通过分析器看到,JVM的大小是原始大小的N倍,同样的N倍的mem也正在传输到flex浏览器应用程序。下面列出了演示该问题的示例代码,其中包含jmap分析器捕获。如果需要,我也很乐意提供flex代码。
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
}内存配置文件位于jdk path中的jmap.exe中。在收到来自客户端的请求之前,JVM中的intitail内存大约为50MB。客户端请求之前jmap的输出。
num #instances :类名的字节数
1-63135- 8497488 - constMethodKlass
2%-65671%- 7858440 % [C
3-91344- 5217976 - symbolKlass
。
。
总计658429-50097416字节//初始内存( JVM )
处理请求后来自jmap的输出。
num #instances :类名的字节数
1-11402- 20225512 - [B ]
2-200000- 1948809 - SampleClass //预期为~2MB
3-62734- 8451040 - constMethodKlass
。
。
在未进行垃圾回收的JVM中,总共消耗了1175132到93938272字节//的内存。
奇怪的是,当我反复尝试从Flex调用相同的方法时,JVM内存并没有相应地增加。这是第一次在JVM中看到成倍的增长。但是,对于每个调用,flex客户端应用程序内存都在不断增加。
我甚至尝试在YourKit分析器上运行相同的代码,并多次尝试调用GC,但都是徒劳的。
有没有人能让我了解一下blazeds里面到底发生了什么。
发布于 2013-02-15 19:23:52
默认的ArrayList容量是10个对象,当你添加新对象后,如果当前容量超过,你的列表将以当前容量的50%增加自身容量。也许这就是喜欢记忆的原因。尝试阅读此文档http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html
https://stackoverflow.com/questions/14893337
复制相似问题