java - blazesds 消耗大量内存

标签 java apache-flex memory-leaks blazeds jmap

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/

相关文章:

java - 使用相同的条件编辑 Mysql 表

apache-flex - 安装 Flex builder 后,Ubuntu 10 上的 Flash 播放器无法正常工作

php - 将自定义对象从 Flash Builder (Flex) 发送到 PHP

c++ - 内存泄漏与否?

java - 从线程返回字符串 Android Java

java - JNI 方法在终止应用程序后执行

java - 使用 POI 读取另外一行 Excel 文件

html - 直接上传图片到服务器

ios - 奇怪和陌生的内存行为

javascript - 移动端js内存泄漏