Spark Tungsten揭秘 Day3 内存分配和管理内幕
Spark Tungsten揭秘 Day3
内存分配和管理内幕
恭喜Spark2.0发布,今天会看一下2.0的源码。
今天会讲下Tungsten内存分配和管理的内幕。Tungsten想要工作,要有数据源和数据结构,这时候会涉及到内存管理,而内存管理也是后续做很多分析和逻辑控制的基础。
内存分配
我们从内存分配的入口MemoryAllocator开始:
allocate() 分配的是一块连续干净的内存空间,如果不是干净的话,会先用zero方法,把里面填充为0。我们注意到操作的数据结构都是MemoryBlock。
MemoryBlock中pageNumber字段是public级别的,方便为TaskMemoryManager修改。内部有一个obj,onheap方式的话是一个字节数组,如果是offheap方式分配的是本地对象的指针。
其中会使用到一个Platform类,相当于Java Bean级别,提供对于数据一系列获取方法。
至于具体的内存分配是如何操作的,我们看一下具体的实现,首先是HeapMemoryAllocator,注释里说明可以分配16G原生数组。
从allocate里面看到,对于大数据量情况,会有一个Pool来管理,Pool中会预先存放各种尺寸的memory块,在获取时直接获取;小数据量的化经过字节对齐之后之后返回对象。
UnsafeMemoryAllocator中直接使用Platform的方法分配,这个方法没有实现,是通过jni,用C和C++实现的,其实就是用C语言分配个空间,跟new一个数组没有多大区别。
在申请内存时,如果不够的话会spill(溢出到磁盘),之后看下release的内容,继续进行获取。
内存管理
无论是UNSAFE还是HEAP的方式,都是采用了MemoryBlock来分配,这有一个很大的好处,是让我们的内存使用者Task,能统一被内存的管理者TaskMemoryManager来分配.
TaskMemoryManager是如何来管理被task分配的内存呢,统一的方法是将地址编码成64字节的长整数。但是对于off-heap和on-heap编码方式是不同。
- off-heap方式下,编码比较简单,直接将物理地址转成64位long即可。
- 而在on-heap方式下,有一个很严重的问题,就是gc时候会导致内存发生改变。所以需要采用间接的方式来保存。实际管理时,我们会建立一个page table,其中会索引到实际的地址,而在编码长整数时,前13个字节代表page编号,指向page table中的某个page,而后51位则记录数据在page中的offset。
- 很多page构成了page table,我们可以定位8192张page,大小是被java数组的上限来限制。理论上一个jvm能支持35TB。
我们看下TaskMemoryManager中的代码,pageTable是个MemoryBlock的数组,会使用一个BitSet来进行索引。
最后,我们有个问题,onheap模式下操作的时候,会根据offset来操作,有没有说操作多大的空间?
因为地址是64位的长整数,onheap方式获得逻辑地址时,会把起始offset和长度都编码进去,获取64位长整数时,有一套读取方式,虽然开始只知道offset,默认会知道下面有几位空间,也就是数据有多长。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580
Spark Tungsten揭秘 Day3 内存分配和管理内幕的更多相关文章
- Spark Tungsten揭秘 Day4 内存和CPU优化使用
Spark Tungsten揭秘 Day4 内存和CPU优化使用 今天聚焦于内存和CPU的优化使用,这是Spark2.0提供的关于执行时的非常大的优化部分. 对过去的代码研究,我们会发现,抽象的提高, ...
- Spark Tungsten in-heap / off-heap 内存管理机制--待整理
一:Tungsten中到底什么是Page? 1. 在Spark其实不存在Page这个类的.Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里 ...
- Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle
Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle 今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle. 首先解释下概念,Tung ...
- Spark Tungsten揭秘 Day1 jvm下的性能优化
Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...
- C/C++内存分配和管理
1. 内存分配和管理 1.1 malloc.calloc.realloc.alloca malloc:申请指定字节数的内存.申请到的内存中的初始值不确定. calloc:为指定长度的对象,分配能容纳其 ...
- Spark Shuffle 中 JVM 内存使用及配置内幕详情
本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified M ...
- golang 学习笔记 ---内存分配与管理
Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免内存碎片,提高内存利用率. 多线程:稳定性,效率问题. 内存分配 内存划分 are ...
- [Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情
本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Mem ...
- spark性能调优(四) spark shuffle中JVM内存使用及配置内幕详情
转载:http://www.cnblogs.com/jcchoiling/p/6494652.html 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1. ...
随机推荐
- JAVA基础之StringBuilder基础方法
StringBuilder sb = new StringBulder("kikikiki"); sb.apend("123") //追加 输出kikik ...
- 转摘:常用ubuntu 关机,重启,注销命令
1.关机命令 shutdown 好像ubuntu的终端中默认的是当前用户的命令,只是普通用户,因此在终端器中可以使用sudo -sh 转换到管理员root用户下执行命令. 1).shutdown –h ...
- hello world from hibernate
初次学习hibernate,第一个程序,用的是XML配置文件 准备工作:下载hibernate的JAR包,我下的是当前最新的4.2.3,SQL的数据库驱动文件SQLJDBC,导入上述架包.
- linux mail 配置
1:sudo apt-get install sendmail sendmail-cf2:ps aux | grep sendmail3.配置/etc/mail/sendmail.mc FEAT ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
- 【STL】全排列生成算法:next_permutation
C++/STL中定义的next_permutation和prev_permutation函数是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列. next_permutation函数 ...
- Spring AOP原理解析
原文链接请参见:http://blog.csdn.net/u010723709/article/details/47839307
- Volley 源码解析
Volley 源码解析 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布. ...
- (转)工作之路---记录LZ如何在两年半的时间内升为PM
原文地址:http://www.cnblogs.com/zuoxiaolong/p/life31.html 引言 之前的伪PM纠结之路已经渐渐结束,LZ也终于正式爬上了PM的位置,对于LZ来说,这个时 ...
- 原生js 实现的瀑布流
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...