BlazeDS 4 用于与 Flex4.6 通信。当 Flex 客户端调用 远程调用 blazeds 服务器,服务器返回一个包含 POJO 的 arrayList。 假设每个 POJO mem 大小为 12 个字节,我期望 arrayList 大小为 是 12* 元素数量。然而,我发现在燃烧的某个地方,它是 多次复合。假设我将 200000 个 POJO 添加到数组列表中, 我预计它的大小约为 2MB。但是,我可以通过分析器看到, JVM 增大了原始大小的 N 倍,内存也增加了 N 倍 也被转移到 Flex 浏览器应用程序。下面列出的是一个 使用 jmap profiler 捕获来演示问题的示例代码。 如果需要的话,我也很乐意提供弹性代码。
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 路径中的 jmap.exe 中进行分析。 在收到客户端请求之前,JVM 中的 intitail 内存约为 50MB。 来自客户端请求之前 jmap 的输出。
num #instances #bytes 类名
1 63135 8497488 constMethodKlass
2 65671 7858440 [C
3 91344 5217976 符号Klass
.
.
总计 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 中发生的事情吗?
最佳答案
默认ArrayList
容量为10个对象,在您添加新对象后,如果当前容量超出,您的列表会以当前容量的50%增加自身容量。也许这就是内存喜欢的原因。尝试阅读此文档 http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html
关于java - blazesds 消耗大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14893337/