堆空间OutOfMemoryError:可用与已请求

时间:2019-03-09 03:37:07

标签: java apache-spark pyspark

我有一个Spark应用程序,遇到了OutOfMemory错误.GC日志如下。有什么办法可以告诉我请求了多少内存,以及请求时有多少可用内存?谢谢!

3429.458: [Full GC (Allocation Failure) [PSYoungGen: 3495918K->3495908K(6990848K)] [ParOldGen: 2096
9872K->20969870K(20971520K)] 24465790K->24465778K(27962368K), [Metaspace: 56727K->56723K(1101824K)]
, 0.4597426 secs] [Times: user=0.90 sys=0.01, real=0.46 secs] 
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill %p"
#   Executing /bin/sh -c "kill 16095"...
os::fork_and_exec failed: Cannot allocate memory (12)
3429.990: [Full GC (Ergonomics) [PSYoungGen: 3495936K->3495906K(6990848K)] [ParOldGen: 20969937K->20969933K(20971520K)] 24465873K->24465840K(27962368K), [Metaspace: 56723K->56723K(1101824K)], 5.4942216 secs] [Times: user=34.79 sys=0.58, real=5.50 secs] 
3435.485: [Full GC (Ergonomics) [PSYoungGen: 3495936K->3495907K(6990848K)] [ParOldGen: 20969933K->20969933K(20971520K)] 24465869K->24465840K(27962368K), [Metaspace: 56723K->56723K(1101824K)], 2.3213689 secs] [Times: user=14.01 sys=0.22, real=2.32 secs] 
3437.823: [Full GC (Ergonomics) [PSYoungGen: 3495936K->3495908K(6990848K)] [ParOldGen: 20970002K->20969998K(20971520K)] 24465938K->24465907K(27962368K), [Metaspace: 56723K->56723K(1101824K)], 0.4090566 secs] [Times: user=0.83 sys=0.01, real=0.40 secs] 

1 个答案:

答案 0 :(得分:1)

  

有没有一种方法可以告诉我请求了多少内存

不是根据所提供的信息。可能根本没有。

  

在请求时有多少可用内存?

根据GC日志,这是内存不足的时间:

3429.458: [Full GC (Allocation Failure) 
           [PSYoungGen: 3495918K->3495908K(6990848K)] 
           [ParOldGen: 20969872K->20969870K(20971520K)] 
           24465790K->24465778K(27962368K), 
           [Metaspace: 56727K->56723K(1101824K)], 0.4597426 secs] 
          [Times: user=0.90 sys=0.01, real=0.46 secs] 

24465790K->24465778K(27962368K)行指出:

  • GC 24465790K之前使用的空间
  • GC 24465778K之后使用的空间
  • GC 27962368K之后的堆空间

因此,似乎27962368K中没有3496590K。

(其他三元组的读取方式相同...)

看起来老一辈子已经饱了。我怀疑GC失败是因为GC无法从伊甸园空间中保管对象。还要注意,年轻一代或老一代的收集者都没有释放太多的内存,而Full GC也没有。

因此,总体诊断是您的堆已满。由于某种原因,分配器无法将新对象放入eden空间。它可能大于eden中的可用空闲空间,或者大于大对象阈值。