Spark的内存模块主要分成两块,一块是用于任务管理的高层,另一块是用于实现spark设计的on-heap内存模式和off-heap模式的基于内存申请和释放,并注重封装、操作规范和流程的工具类。
使用到memoryblock, 它只负责判断当前是否拿到内存,内存释放的类型,当前内存长度,填充后,父类是 memorylocation。
要读完对taskmemorymanager, 就要读懂这些工具类。
工具类中和内存相关的主要这五个文件,先从大体上弄清他们的角色,在细化研究他们的设计和模式,最后写一篇分享报告。
工具类放在common下面,方便其他包的使用,全部是public
memorylocation的作用是存放内存块的起始地址和offset,起始的类型是object, offset类型是long
memoryblock的作用是基于memorylocation得到的起始地址,记录从该起始地址开始,得到的内存块的大小,所以引入了length变量,并且加上对该内存块进行初始化的函数 fill, 初始化的时候使用到platform的setmemory函数,该函数的参数有起始地址obj, 偏移地址offset和内存块长度length,以及初始化用的value。
memoryallocator是一个接口,里面定义了三个变量,2个对象和一个函数。两个对象都是这个接口的实现,两个方法主要涉及内存申请和释放,操作的对象是memoryblock。这个接口的功能是对申请到的内存进行初始化或者释放的内存进行初始化,防止错误使用带来的异常。
HeapMemoryAllocator堆内存申请,最大16g,主要对memoryblock进行管理,按照堆的形式进行初始化赋值和释放内存,其中使用到一个变量是复杂数据结构,其实使用hashmap,键是long型的,叫size, 值是一个linkedlist列表,列表的成员是long型数组。这里面有几个疑问:1.size的定义问题,size如果是随机的大小,那么很难匹配到合适的value。
unsafememoryallocator和堆内存分配的区别,为什么叫不安全unsafe?
java魔法类sun.misc.Unsafe,避开jvm的功能,直接控制内存,缺点是需要手动释放内存。
这样设计五个类的优缺点:
memorylocation只是关注于内存的起始地点,总和考虑到on和off两种需要,设计了obj和offset两个变量。on模式的时候object是数组的基地址,off模式的时候obj是null,直接存储申请到的地址。
memoryblock关注内存块的概念,引入了长度,和引入四个能表现当前内存块状态的变量:NO_PAGE_NUMBER没有申请到分页,FREED_IN_TMM_PAGE_NUMBER表示已经被tmm释放过的内存块,FREED_IN_ALLOCATOR_PAGE_NUMBER表示被meoryallocator释放。
NO_PAGE_NUMBER该内存块被使用的TMM的id
memoryallocator是一个接口,接口的意义是抽象类的共性,这里抽象了
MEMORY_DEBUG_FILL_ENABLED标识申请或者释放内存
MEMORY_DEBUG_FILL_CLEAN_VALUE申请内存之后进行初始化的赋值
MEMORY_DEBUG_FILL_FREED_VALUE释放了内存之后初始化的数值
allocate申请内存的函数
free释放内存的函数
同时还声明了两个内存类型的变量,一个heap类型,一个是unsafe,在继承类里没有看到,作用有待观察。
UnsafeMemoryAllocator.java继承了memoryallocator,里面只有两个函数,override了父类的两个方法,即
使用到memoryblock, 它只负责判断当前是否拿到内存,内存释放的类型,当前内存长度,填充后,父类是 memorylocation。
要读完对taskmemorymanager, 就要读懂这些工具类。
工具类中和内存相关的主要这五个文件,先从大体上弄清他们的角色,在细化研究他们的设计和模式,最后写一篇分享报告。
工具类放在common下面,方便其他包的使用,全部是public
memorylocation的作用是存放内存块的起始地址和offset,起始的类型是object, offset类型是long
memoryblock的作用是基于memorylocation得到的起始地址,记录从该起始地址开始,得到的内存块的大小,所以引入了length变量,并且加上对该内存块进行初始化的函数 fill, 初始化的时候使用到platform的setmemory函数,该函数的参数有起始地址obj, 偏移地址offset和内存块长度length,以及初始化用的value。
memoryallocator是一个接口,里面定义了三个变量,2个对象和一个函数。两个对象都是这个接口的实现,两个方法主要涉及内存申请和释放,操作的对象是memoryblock。这个接口的功能是对申请到的内存进行初始化或者释放的内存进行初始化,防止错误使用带来的异常。
HeapMemoryAllocator堆内存申请,最大16g,主要对memoryblock进行管理,按照堆的形式进行初始化赋值和释放内存,其中使用到一个变量是复杂数据结构,其实使用hashmap,键是long型的,叫size, 值是一个linkedlist列表,列表的成员是long型数组。这里面有几个疑问:1.size的定义问题,size如果是随机的大小,那么很难匹配到合适的value。
unsafememoryallocator和堆内存分配的区别,为什么叫不安全unsafe?
java魔法类sun.misc.Unsafe,避开jvm的功能,直接控制内存,缺点是需要手动释放内存。
这样设计五个类的优缺点:
memorylocation只是关注于内存的起始地点,总和考虑到on和off两种需要,设计了obj和offset两个变量。on模式的时候object是数组的基地址,off模式的时候obj是null,直接存储申请到的地址。
memoryblock关注内存块的概念,引入了长度,和引入四个能表现当前内存块状态的变量:NO_PAGE_NUMBER没有申请到分页,FREED_IN_TMM_PAGE_NUMBER表示已经被tmm释放过的内存块,FREED_IN_ALLOCATOR_PAGE_NUMBER表示被meoryallocator释放。
NO_PAGE_NUMBER该内存块被使用的TMM的id
memoryallocator是一个接口,接口的意义是抽象类的共性,这里抽象了
MEMORY_DEBUG_FILL_ENABLED标识申请或者释放内存
MEMORY_DEBUG_FILL_CLEAN_VALUE申请内存之后进行初始化的赋值
MEMORY_DEBUG_FILL_FREED_VALUE释放了内存之后初始化的数值
allocate申请内存的函数
free释放内存的函数
同时还声明了两个内存类型的变量,一个heap类型,一个是unsafe,在继承类里没有看到,作用有待观察。
UnsafeMemoryAllocator.java继承了memoryallocator,里面只有两个函数,override了父类的两个方法,即