HPROF结果解释

时间:2013-11-09 19:54:05

标签: java scala file-io hprof space-efficiency

我有两组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的末尾范围内,我不会小心删除/释放它们。你们感觉到瓶颈吗?

1 个答案:

答案 0 :(得分:2)

  

因为,myFunction中创建的对象将在myFunction

的末尾范围
不,他们不会。这不是C ++。所有对象都在堆上创建并保持存在,直到垃圾可收集为止。

另外,你还没有在你的伪代码中的任何地方声明op_line,所以我认为它是在方法调用之间保留的,我猜这是你的内存泄漏。我的意思是你不应该有单个字符数组包含> 1亿个字节,这就是“小”堆转储所说的。