内存管理

zqzhen zqzhen     2022-12-10     543

关键词:

作为一个JVM进程,EXecutor的内存管理建立在JVM的内存管理之上,Spark对JVM的对内空间进行了更为详细的分配,以充分利用内存。同时,Spark引入了堆外内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化内存的使用。
堆内内存收到JVM统一管理,堆外内存是直接向操作系统进行内存的申请和释放。
技术图片

1.堆内内存
由Spark程序启动时的-executor-memory或者spark.executor.memory参数配置。
Executor内运行的并发任务在缓存RDD数据和广播数据时占用的内存被规划为存储内存,在执行Shuffle时占用的的内存被规范为执行内存,剩余部分不做特殊规划,spark内部的对象实例,或者自定义的Spark应用程序中的对象实例,均占用剩余的空间。
Spark并不能控制堆内内存的使用,只能记录。堆内内存由JVM管控,所以Spark标记为释放的对象实例,很有可能在实际并没有被JVM回收,导致实际可以用的内存小于Spark记录的可用内存。古不能全避免OOM。
技术图片

2.堆外内存
为了进一步优化内存的使用提高Shuffle时排序的效率,spark引入堆外内存,存储经过序列化的二进制数据。利用JDK Unsafe API,Spark可以直接操作系统堆外内存,减少不必要的内存开销。

3.内存管理
对于堆内内存,在Spark1.6之前使用的是静态内存管理,每个内存区域都分配固定空间,互相不可逾越,存储内存60%,运行内存20%,其他内存20%,并且都要预留内存,防止OOM。1.6之后使用的是统一管理,存储内存和执行内存共享一块内存空间(60%),可以动态使用对方的空闲区域。堆外内存,不用预留空间(内存空间由Spark管理,可以不用担心OOM),但是老版本存储内存和执行内存也是写死的,新版本才变为动态管理。不管是堆内还是堆内内存,当存储内存占用了运行内存时,shuffle操作需要更多内存时,被占用的内存会被强制收回,溢出的存储内存的东西或写出磁盘或丢弃,要看缓存级别。反之,当执行内存需要更多空间时,此时存储内存只能等待对方释放。
技术图片

4.RDD缓存过程
避免产生内存碎片,以unroll方式进行,缓存到存储内存后,以block形式存储。
技术图片












:内存管理--内存管理的概念

1.内存管理的概念1.1内存空间的分配与回收1.2内存空间的扩充补充:操作系统的四大特性1.3地址转换转换的三种方式:转入内存的三种方式详解1.4存储保护1.5小结 查看详情

关于内存管理

内存管理涉及根据数据库更改的需求为OracleDatabase实例内存结构维护最佳大小。必须管理的内存结构是系统全局区域(SGA)和实例程序全局区域(实例PGA)。Oracle数据库支持各种由初始化参数设置选择的内存管理方法。Oracle建议... 查看详情

rt-thread--内存管理(代码片段)

内存管理的功能特点RT-Thread操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提供了不同的内存分配管理算法。总体上可分为两类:内存堆管理与内存池管理,而内存堆管理又根据具体内存设备划分为三种情... 查看详情

内存管理与运行时

所有运行时的内存管理都是针对虚拟内存进行管理的。 内存管理策略:1)手动管理:c、c++;2)引用计数;3)垃圾收集。 运行时管理策略: 手动管理:内存分散管理,随时释放; 引用计数:1)手动管理:计数为... 查看详情

stm32内存管理(代码片段)

动态内存管理根据需要分配內存和回收内存通常在一块较大且连续的内存空间上进行分配和回收动态内存管理解决的问题内存资源稀缺,通过内存复用增加任务的并发性动态内存管理的本质时间换空间,通过动态分配和... 查看详情

内存管理

作为一个JVM进程,EXecutor的内存管理建立在JVM的内存管理之上,Spark对JVM的对内空间进行了更为详细的分配,以充分利用内存。同时,Spark引入了堆外内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化内存的使用... 查看详情

操作系统-页式内存管理

页式内存管理上A.段式内存管理1.指的是一段连续的内存空间2.段式内存管理-程序的各个部分相对独立(数据段,代码段),早期x86处理器无法通过一个寄存器访问所有内存单元,解决早期程序运行的重定位问题段式内存管理的应用... 查看详情

使用自动内存管理(代码片段)

本节提供有关Oracle数据库的自动内存管理功能的背景信息,并包含有关启用此功能的说明。涵盖以下主题:关于自动内存管理启用自动内存管理监视和调整自动内存管理关于自动内存管理管理实例内存的最简单方法是让Oracle数据... 查看详情

操作系统内存管理

1.内存管理方法     内存管理主要包含虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。 2.连续分配存储管理方式     连续分配是指为一个用户程序分配连续的内... 查看详情

内存管理技术

任何语言都会涉及到内存的管理和使用,很多语言要求开发人员自己进行所有内存的管理工作,如c++等。而内存管理要求的技术难度很大,很多开发人员不能很好地完成,同时也成为意向沉重的负担。java则不同,其为内存管理... 查看详情

了解动态内存管理函数melloccallocfreerealloc,实现内存管理自由!(代码片段)

动态内存管理笔记自取链接:动态内存管理笔记文章目录动态内存管理导言一、mallco开辟动态内存空间二、free释放动态内存空间三、calloc初始化+开辟动态内存空间四、realloc调整动态内存空间大小小结导言众所周知~,... 查看详情

linux操作系统原理—内存管理—页式内存管理技术

目录文章目录目录虚拟内存技术页式内存管理技术虚拟内存技术虚拟内存技术是操作系统实现的一种高效的物理内存管理方式,具有以下作用:使得进程间彼此隔离:通过将物理内存和虚拟地址空间联系起来,并将虚拟地址空间... 查看详情

操作系统——内存管理:内存管理策略

1.内存管理策略1.1背景1.1.1基本硬件1.1.2地址绑定1.1.3逻辑地址空间与物理地址空间1.1.4动态加载1.2交换1.3连续内存分配1.3.1内存保护1.3.2内存分配1.3.3内存碎片1.4分段1.5分页1.6页表结构1.6.1分层分页1.6.2哈希页表1.6.3倒置页表  计... 查看详情

spark从入门到精通spark内存管理详解-堆内&堆外内存管理

前言Spark作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色。理解Spark内存管理的基本原理,有助于更好地开发Spark应用程序和进行性能调优。本文将详细介绍两部分内容,第一部分介绍Spa... 查看详情

linux内存管理子系统(概念入门)

...模型Linux虚拟地址空间分布虚拟地址转化为物理地址物理内存分配大纲内存管理子系统内存管理模型地址映射管理物理地址分配管理子系统简介Linux内核系统构成管理模型Linux内存子系统管理模型上面的三个部分主要做物理内存分... 查看详情

linux内存管理子系统(概念入门)

...模型Linux虚拟地址空间分布虚拟地址转化为物理地址物理内存分配大纲内存管理子系统内存管理模型地址映射管理物理地址分配管理子系统简介Linux内核系统构成管理模型Linux内存子系统管理模型上面的三个部分主要做物理内存分... 查看详情

sylixos定长内存管理

1.定长内存管理介绍所谓定长内存,指的是用户每次分配获得的内存大小是相同的,即使用的是有确定长度的内存块。同时,这些内存块总的个数也是确定的,即整个内存总的大小也是确定的。这和通常理解的内存池的概念是一... 查看详情

ios中的内存管理(代码片段)

在讲述iOS中的内存管理之前,先介绍一下其他语言中的内存管理,其实内存管理主要讲的是堆内存的管理,因为其他类型的内存,比如栈内存、全局变量/静态区内存、常量等各种语言的内存管理都差不多。Java中... 查看详情