BlazeDS 4 用于与 Flex4.6 通信。当 flex 客户端在 blazeds 服务器上调用远程调用时,服务器返回一个包含 POJO 的 arrayList。假设每个 POJO 内存大小为 12 个字节,我期望 arrayList 大小为 12*元素数。然而,我发现在某处闪耀,它被复合了多次。假设我将 200000 个 POJO 添加到数组列表中,我预计它的大小约为 2MB。但是,我可以通过分析器看到,JVM 的大小是原始大小的 N 倍,并且同样的 N 倍 mem 也被传输到 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
。
.
total 658429 50097416 //JVM中的初始内存
处理请求后 jmap 的输出。
num #instances #bytes 类名
1 11402 20225512 [B
2 200000 1948809 SampleClass //预期为 ~2MB
3 62734 8451040 constMethodKlass
。
.
total 1175132 93938272 //在 JVM 中消耗了未被垃圾回收的内存。
奇怪的是,当我反复尝试从 Flex 调用相同的方法时,JVM 内存并没有相应增加。这只是 JVM 中第一次出现多倍增长。但是,每次调用时,flex 客户端应用程序内存都会不断增加。
我什至尝试在 YourKit 分析器上运行相同的程序,并尝试多次调用 GC 都是徒劳的。
有人可以让我了解 blazeds 中发生了什么。