普通堆内存管理
启动进程会为进程在内存中开辟一个jvm
这个进程的jvm中95%的内存都是堆内存,其他为栈内存等
在一个jvm中的进程里,当内存满的时候jvm会进行垃圾回收,回收一部分不使用的内存,或者直接暂停进程进行回收,这个垃圾回收的时机不是我们自己能够控制的
jvm垃圾回收机制GC:
min GC:一边运行进程一边回收
full GC:将进程停止后再进行GC,对进程的运行影响非常大
spark中的堆内存管理:
spark 中的进程在启动jvm后,还会额外向系统申请内存
所以在jvm中的内存称为堆内内存(on-heap memory)
而向系统申请的内存称为堆外内存(off-heap memory)
这样就能自己控制什么时候进行GC了
spark进程jvm堆内内存分配
在旧版本中使用的是静态堆内存分配,内存之间的使用占比是写死的,无法通动态借用
新版本使用的是:
同一内存管理,管理机制:
内存占用:40%:other和system reserved写死
内存占用:60%:Storage 和 Execution 可以动态变化,相互借用
1)当Storage和Execution内存都不足的时候,两者都开始溢写到磁盘
2)当Storage内存不足,Execution内存充足:storage可以向execution借用
直到execution内存也不足的时候jvm会释放掉storage借用的那部分内存
3)当Execution内存不足,Storage内存充足:execution可以向Storage借用
直到Storage内存内也不足的时候,jvm不会释放掉execution的内存,storage开始溢写到磁盘
总结:内存不足时,借用不分会被gc处理,不被借用不分会溢写
也就是说在这个机制中,Execution是优先于storage的
使用的垃圾回收器:
jdk1.7 : 默认使用CMS
jdk1.8: 默认使用 Parallel Scavenge
jdk1.9 : 默认使用G1(presto) G1:garbage first
Spark使用G1
-XX:+UseG1GC 在SparkEnv中配置!