BlazeDS 4用于与Flex4.6通信。当flex客户端调用 对blazeds服务器进行远程调用,服务器返回包含POJO的arrayList。 假设每个POJO mem大小为12个字节,我期望arrayList大小为 是12 *元素的数量。但是,我发现在blazeds的某个地方,它是 复合多次。假设我在阵列列表中添加了200000个POJO, 我期待它的大小约为2MB。但是,我可以通过剖析器看到, JVM的原始大小是N倍,而N的内存是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中进行了分析,它驻留在jdk路径中。 在收到客户端请求之前,JVM中的intitail内存大约为50MB。 来自客户端请求之前jmap的输出。
num #instances #bytes类名
1 63135 8497488 constMethodKlass
2 65671 7858440 [C
3 91344 5217976 symbolKlass
。
。
总计658429 50097416 // JVM中的初始内存
处理请求后jmap的输出。
num #instances #bytes类名
1 11402 20225512 [B
2 200000 1948809 SampleClass //预期为~2MB
3 62734 8451040 constMethodKlass
。
。
总计1175132 93938272 // JVM中消耗的内存未被垃圾回收。
奇怪的是,当我尝试重复从Flex调用相同的方法时,JVM内存不会相应增加。这只是JVM中第一次出现多倍增长。但是,Flex客户端应用程序内存对于每次调用都会不断增加。
我甚至尝试在YourKit探查器上运行相同的操作,并尝试多次无效地调用GC。
有人可以让我了解blazeds中发生的事情。
答案 0 :(得分:1)
默认ArrayList
容量为10个对象,在您添加新对象后,如果当前容量结束,您的列表会将自身容量增加50%的当前容量。也许这就是记忆力的原因。尝试阅读此文档http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html