我有两组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的末尾范围内,我不会小心删除/释放它们。你们感觉到瓶颈吗?
答案 0 :(得分:2)
不,他们不会。这不是C ++。所有对象都在堆上创建并保持存在,直到垃圾可收集为止。因为,myFunction中创建的对象将在myFunction
的末尾范围
另外,你还没有在你的伪代码中的任何地方声明op_line
,所以我认为它是在方法调用之间保留的,我猜这是你的内存泄漏。我的意思是你不应该有单个字符数组包含> 1亿个字节,这就是“小”堆转储所说的。