0

我有两组 HProf 转储,一组用于大样本,另一组用于较小样本 - 两者都是我拥有的大量数据的非常小的样本的结果。我试图找出我方法中的瓶颈。

这是我的大( http://pastebin.com/PEH8yR3v)和小样本(http://pastebin.com/aR8ywkDH )的堆分配数据。

我注意到 char[] 是占用我大部分内存的那个。此外,char[] 占用的内存百分比从小样本运行到大样本运行不等。我不知道当我分析我的整个样本时它会如何变化。

但是,我关心的重要问题是 - 当我尝试运行一个 3GB 大小的输入数据(它写回 10GB 数据)时,使用这个程序(READ、PARSE/PROCESS、WRITE)。除了大小不超过 1GB 的列表外,我不会在内存中存储任何内容 - 这是普通的读取、处理、写入管道。鉴于此,我的程序在运行时仍需要大约 7GB 的主内存。

这是我的做法,

read a file in from a string Iterator
for each line in ip_file perform 
  op_buffer = myFunction(line)
write op_buffer to op_file.
Perform this for all 20K files in my input data. 

def myFunction(line)
{
 var :String = null;
 for each word in line  
  {
   var class_obj = new Classname(word)
   op_line + = class_obj.result
  }
return op_line
}

由于在 myFunction 中创建的对象将在 myFunction 结束时超出范围,因此我不会注意删除/释放它们。各位有没有感觉到瓶颈?

4

1 回答 1

2

因为,在 myFunction 中创建的对象将在 myFunction 结束时扩大范围

不,他们不会。这不是 C++。所有对象都在堆上创建并一直存在,直到可回收垃圾为止。

另外,你没有op_line在你的伪代码中声明任何地方,所以我假设它在方法调用之间被保留,我猜那是你的内存泄漏。我的意思是你不可能有一个由> 1亿字节组成的单个字符数组,这就是“小”堆转储所说的。

于 2013-11-09T20:07:01.087 回答