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. ...
随机推荐
- c语言_判断例子
例一: #include "stdio.h" int main() { ; if(i) printf("hi"); if(!i) printf("hi ...
- 二维线段树 HDU 1823最简单的入门题
xiaoz 征婚,首先输入M,表示有M个操作. 借下来M行,对每一行 Ih a l I 表示有一个MM报名,H是高度, a是活泼度,L是缘分. 或 Q h1 h2 a1 a2 求 ...
- Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)
Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...
- python分页和session和计算时间差
分页 #!/usr/bin/env python # -*- coding:utf-8 -*- class Pagenation: def __init__(self,current_page,all ...
- DedeCMS更新文章同步发布到新浪微博
如果在网站推广过程中能利用好微博这个工具的话,将会给网站的推广工作带来巨大的便利.下面以dede程序为例讲讲如何将网站内容自动同步到新浪微博. 在新浪微博的工具中有个自动关联博客的功能,利用好这个功能 ...
- hdu 4630 树状数组
思路:这题的处理方式和hdu4358有点像.我们用一个pre[x]表示约数x的倍数上次出现的位置,将查询按区间的右节点升序排序.num[i]的约数为j,如果pre[j]为0,就将pre[j]置为i;否 ...
- C# Windows Service服务的创建和调试
前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录 ...
- HDOJ2006求奇数的乘积
求奇数的乘积 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Servlet之编码过滤
创建CharactorFilter类,实现javax.servlet.Filter接口: package com.caiduping; import java.io.IOException; impo ...
- C# Winform AutoScaleMode属性
属性的用法: None : 禁用自动缩放.(默认时) Font :根据类使用的字体(通常为系统字体)的维度控制缩放. Dpi : 根据显示分辨率控制缩放.常用分辨率为 96 和 120 DPI. In ...