我有一个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]
答案 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)
行指出:
因此,似乎27962368K中没有3496590K。
(其他三元组的读取方式相同...)
看起来老一辈子已经饱了。我怀疑GC失败是因为GC无法从伊甸园空间中保管对象。还要注意,年轻一代或老一代的收集者都没有释放太多的内存,而Full GC也没有。
因此,总体诊断是您的堆已满。由于某种原因,分配器无法将新对象放入eden空间。它可能大于eden中的可用空闲空间,或者大于大对象阈值。