0

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 中发生了什么。

4

1 回答 1

1

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

于 2013-02-15T11:23:51.923 回答