java垃圾回收器回顾
Serial GC:
优点:单线程精简的GC实现,无需维护复杂的数据结构,初始化简单,是client模式下JVM默认选项。最古老的GC。
缺点:会进入"Stop-The World"状态。
ParNew GC:
新生代GC实现,是SerialGC的多线程版本,最常见的应用场景是配合老年代的CMS GC 工作
CMS(Concurrent Mark Sweep)GC :
优点: 基于标记-清除(Mark-Sweep)算法,尽量减少停顿时间。
缺点: 存在碎片化问题,在长时间运行的情况下会发生full GC,导致恶劣停顿。会占用更多的CPU资源,和用户争抢线程。在JDK 9中被标记为废弃。
Parrallel GC:
在JDK8等版本中,是server模式JVM的默认GC选择,也被称为吞吐量优先的GC,算法和Serial GC相似,特点是老生代和新生代GC并行进行,更加高效。
使用java -XX:+PrintCommandLineFlags -version查看
G1 GC:
兼顾了吞吐量和停顿时间的GC实现,是Oracle JDK 9后默认的GC
可以直观的设值停顿时间,相对于CMS GC ,G1未必能做到CMS最好情况下的延时停顿,但比最差情况要好得多
G1 仍存在年代的概念,使用了Region棋盘算法,实际上是标记-整理(Mark-Compact)算法,可以避免内存碎片,尤其是堆非常大的时候,G1优势更明显。
G1 吞吐量和停顿表现都非常不错。
note: 虽然G1和CMS两种回收器性能不错,但是oracle官方有一段提醒:
If you are using CMS or ParallelOldGC and your application is not experiencing long garbage collection pauses, it is fine to stay with your current collector. Changing to the G1 collector is not a requirement for using the latest JDK.
意思是如果程序没有崩溃,没有经历长时间的垃圾收集暂停,那么可以继续使用当前的收集器。。。
所以在数据量大的情况下,spark程序出现过timeout现象,就要更改为G1回收器。
error: file not found/file lost/timeout
调节连接等待时长
spark.core.connection.ack.wait.timeout
error: executor lost,oom,shuffle output file cannot find
调节executor堆外内存
spark.yarn.executor.memoryOverhead
网友评论