blazesds消耗巨大的记忆

时间:2013-02-15 11:06:30

标签: java flex memory-leaks blazeds jmap

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中发生的事情。

1 个答案:

答案 0 :(得分:1)

默认ArrayList容量为10个对象,在您添加新对象后,如果当前容量结束,您的列表会将自身容量增加50%的当前容量。也许这就是记忆力的原因。尝试阅读此文档http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html