Java Hadoop:堆空间和gc问题

Java Hadoop:堆空间和gc问题,java,garbage-collection,hadoop,heap,multicore,Java,Garbage Collection,Hadoop,Heap,Multicore,我目前正在从事一个项目,我需要有一个内存中的结构,为我的地图任务。我做了一些计算,我可以说,我不需要超过600兆的内存为每个地图任务。 但问题是,过了一段时间,我遇到了java堆空间问题或gc开销限制。我不知道这怎么可能 这里有更多的细节。我有两个四核系统,内存为12GB。这意味着我可以同时运行多达8个映射任务。我正在构建一棵树,所以我有一个迭代算法,它为每一棵树级别执行一个map reduce任务。我的算法适用于小型数据集,但对于中型数据集则存在堆空间问题。我的算法达到了某个树级别,然后超出了

我目前正在从事一个项目,我需要有一个内存中的结构,为我的地图任务。我做了一些计算,我可以说,我不需要超过600兆的内存为每个地图任务。 但问题是,过了一段时间,我遇到了java堆空间问题或gc开销限制。我不知道这怎么可能

这里有更多的细节。我有两个四核系统,内存为12GB。这意味着我可以同时运行多达8个映射任务。我正在构建一棵树,所以我有一个迭代算法,它为每一棵树级别执行一个map reduce任务。我的算法适用于小型数据集,但对于中型数据集则存在堆空间问题。我的算法达到了某个树级别,然后超出了堆空间,或者有gc开销问题。在这一点上,我做了一些计算,我发现每个任务不需要超过100MB的内存。因此,对于8个任务,我使用了大约800MB的内存。我不知道发生了什么事。我甚至用以下几行代码更新了hadoop-env.sh文件:

   export HADOOP_HEAPSIZE=8000
   export HADOOP_OPTS=-XX:+UseParallelGC
有什么问题?这些行是否覆盖了我的系统的java选项?使用parallelGC是我在互联网上看到的,当有多个内核时,我建议使用它

     edits
好的,下面是在监视堆空间和总内存后进行的一些编辑。 当同时运行6个任务时,我会消耗大约3500MB的RAM。这意味着jobtracker、tasktracker、namenode、datanode、secondary namenode我的操作系统和6个任务都使用3500内存,这是一个非常合理的大小。那么为什么我会得到gc开销限制呢?
对于每个树级别,我都遵循相同的算法。唯一改变的是每个树级别中的节点数。在树级别中有许多节点,不会给我的算法增加太多开销。那么为什么gc不能很好地工作呢?

如果最大内存大小没有改变,它将是主内存的1/4,即大约3 GB,加上一些非堆使用的开销可能是3.5 GB

我建议你试试

export HADOOP_OPTS="-XX:+UseParallelGC -Xmx8g"
将最大内存设置为8 GB


默认情况下,最大堆大小为内存的1/4(除非您在Windows上运行32位JVM)。因此,如果忽略最大堆大小,它仍将是3 GB

无论您使用一个GC还是另一个GC,当您的内存用完时,这都不会有多大区别


我建议您使用
-XX:+HeapDumpOnAutofMemoryError
进行堆转储,并在探查器(例如VisualVM)中阅读此内容,以了解为什么它使用了如此多的内存。

您可以发布您的映射并减少方法吗?我可以,但它们有点复杂。在这里发布我的代码会非常混乱。如果你还想看的话,再问我一次,或者你可以在程序运行时运行VisualVM来查看使用了多少内存。你可以分析内存以查看是什么在使用内存。因此你告诉我,我以某种方式使用了所有8GB内存??你将能够看到它是否使用了那么多内存,并像使用最多的类一样分解space.conf/hadoop-env.sh:第19行:导出:`-mx8g':不是有效的标识符