多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# spark的内存管理机制: ## 堆内内存:     作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存。同时,Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用。   堆内内存:堆内内存的大小,由 Spark 应用程序启动时的 –executor-memory参数配置,一个Executor中的内存分为三块,一块是execution内存,一块是storage内存,一块是other内存。   (1)execution内存是执行内存,文档中说join,aggregate都在这部分内存中执行,shuffle的数据也会先缓存在这个内存中,满了再写入磁盘,能够减少IO。其实map过程也是在这个内存中执行的。   (2)storage内存是存储broadcast,cache,persist数据的地方。   (3)other内存是程序执行时预留给自己的内存。 ## 堆外内存:   Off-heap memory不在 JVM 内申请内存,而是调用 Java 的 unsafe 相关 API (类似于malloc()函数)直接向操作系统申请内存由于这种方式不进过 JVM 内存管理,所以可以避免频繁的 GC,这种内存申请的缺点是必须自己编写内存申请和释放的逻辑。堆外内存只区分 Execution 内存和 Storage 内存。   无论堆内和堆外内存目前 Execution 内存和 Storage 内存可以互相共享的。也就是说,如果 Execution 内存不足,而 Storage 内存有空闲,那么 Execution 可以从 Storage 中申请空间;反之亦然。