在Map器端清理方法中,我遇到了heap space outofmemory错误,我从inputstream读取数据,并使用ioutils.tobytearray(inpustream)将其转换为字节数组;
我知道我可以通过增加最大堆空间(xmx)来解决这个问题,但是我应该已经有足够的堆空间(1gb)了。我找到了下面关于调试的信息(大概的空间值),
runtime.maxMemory() - 1024Mb
runtime.totalMemory - 700Mb
runtime.freeMemory - 200Mb
我的数据块大小是128MB,我不会在我的recordreader上添加任何额外的数据。我从Map器输出的大小不会超过128MB。我还看到了inputstream(.available())中的可用字节,它提供了大约128MB的值。
我对jvm的内存分配也有点困惑。假设我将堆空间值设置为xms-128m;xmx-1024米。我的tasktracker有16gbram,已经有8jobs(8jvm)运行在这个tasktracker中了。让我们假设tasktracker只能为jvm分配8.5gbram,其余的将用于内部用途。因此,我们有8.5gb的内存可用,8个任务正在运行,目前只使用6gb内存。是否可以将新任务分配给同一个任务跟踪器,因为已经有8个任务正在运行,这可能需要8gb,在这种情况下,如果需要,新任务将无法提供用户请求的堆大小(1gb)。
ps:我知道并不是所有堆都需要在ram(分页)中。我的主要问题是,用户是否能够在所有场景中获得请求的最大堆大小?
暂无答案!
目前还没有任何答案,快来回答吧!