Java 这会消耗大量内存
BlazeDS 4用于与Flex4.6通信。当flex客户端调用 远程调用blazeds服务器,服务器返回一个包含POJO的arrayList。 假设每个POJO mem大小为12字节,我希望arrayList的大小为 元素数为12*。然而,我发现在blazeds的某个地方 复合多次。假设我在数组列表中添加200000个POJO, 我预计它的大小约为2MB。但是,我能看穿剖析器, JVM的大小是原来的N倍,而mem的大小是原来的N倍 也被传输到flex浏览器应用程序。下面列出的是一个 演示问题的示例代码,以及jmap探查器捕获。 如果需要,我也很乐意提供flex代码Java 这会消耗大量内存,java,apache-flex,memory-leaks,blazeds,jmap,Java,Apache Flex,Memory Leaks,Blazeds,Jmap,BlazeDS 4用于与Flex4.6通信。当flex客户端调用 远程调用blazeds服务器,服务器返回一个包含POJO的arrayList。 假设每个POJO mem大小为12字节,我希望arrayList的大小为 元素数为12*。然而,我发现在blazeds的某个地方 复合多次。假设我在数组列表中添加200000个POJO, 我预计它的大小约为2MB。但是,我能看穿剖析器, JVM的大小是原来的N倍,而mem的大小是原来的N倍 也被传输到flex浏览器应用程序。下面列出的是一个 演示问题的
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;
内存在jmap.exe中进行分析,jmap.exe位于jdk路径中。
在从客户端接收请求之前,JVM中的初始内存约为50MB。
客户端请求之前来自jmap的输出
num#实例#字节类名163135 8497488 constMethodKlass
2656717858440[C
3913445217976 symbolKlass
.
.
总计658429 50097416//JVM中的初始内存
处理请求后jmap的输出 num#实例#字节类名
1140220225512[B
2 200000 1948809样本类//预计为~2MB
3627348451040 constMethodKlass
.
.
总计1175132 93938272//JVM中未垃圾收集的已消耗内存。
奇怪的是,当我尝试从Flex重复调用同一个方法时,JVM内存并没有相应增加。这只是JVM中第一次出现多倍的增加。但是,每次调用Flex客户端应用程序内存都会不断增加 我甚至尝试在YourKit profiler上运行同样的程序,并多次尝试调用GC,但都没有成功
有人能让我了解blazeds内部的情况吗。默认情况下,ArrayList的容量为10个对象,在添加新对象后,如果当前容量已过,您的列表会将自身容量增加到当前容量的50%。可能这是内存不足的原因。请尝试阅读此文档。我尝试执行相同的co在独立应用程序中使用de,但arrayList仍然消耗了约2MB。当列表通过blazeds发送回flex浏览器应用程序时,就会出现问题。
public class SampleClass
{
long id;
int age;
// getters and setters for each variables
}