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 内存分配和管理内幕的更多相关文章

  1. Spark Tungsten揭秘 Day4 内存和CPU优化使用

    Spark Tungsten揭秘 Day4 内存和CPU优化使用 今天聚焦于内存和CPU的优化使用,这是Spark2.0提供的关于执行时的非常大的优化部分. 对过去的代码研究,我们会发现,抽象的提高, ...

  2. Spark Tungsten in-heap / off-heap 内存管理机制--待整理

    一:Tungsten中到底什么是Page? 1. 在Spark其实不存在Page这个类的.Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里 ...

  3. Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle

    Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle 今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle. 首先解释下概念,Tung ...

  4. Spark Tungsten揭秘 Day1 jvm下的性能优化

    Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...

  5. C/C++内存分配和管理

    1. 内存分配和管理 1.1 malloc.calloc.realloc.alloca malloc:申请指定字节数的内存.申请到的内存中的初始值不确定. calloc:为指定长度的对象,分配能容纳其 ...

  6. Spark Shuffle 中 JVM 内存使用及配置内幕详情

      本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified M ...

  7. golang 学习笔记 ---内存分配与管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免内存碎片,提高内存利用率. 多线程:稳定性,效率问题. 内存分配   内存划分 are ...

  8. [Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情

    本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Mem ...

  9. spark性能调优(四) spark shuffle中JVM内存使用及配置内幕详情

    转载:http://www.cnblogs.com/jcchoiling/p/6494652.html 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1. ...

随机推荐

  1. c语言_判断例子

    例一: #include "stdio.h" int main() { ; if(i) printf("hi"); if(!i) printf("hi ...

  2. 二维线段树 HDU 1823最简单的入门题

    xiaoz 征婚,首先输入M,表示有M个操作. 借下来M行,对每一行   Ih a l     I 表示有一个MM报名,H是高度, a是活泼度,L是缘分. 或   Q h1 h2 a1 a2    求 ...

  3. 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. ...

  4. python分页和session和计算时间差

    分页 #!/usr/bin/env python # -*- coding:utf-8 -*- class Pagenation: def __init__(self,current_page,all ...

  5. DedeCMS更新文章同步发布到新浪微博

    如果在网站推广过程中能利用好微博这个工具的话,将会给网站的推广工作带来巨大的便利.下面以dede程序为例讲讲如何将网站内容自动同步到新浪微博. 在新浪微博的工具中有个自动关联博客的功能,利用好这个功能 ...

  6. hdu 4630 树状数组

    思路:这题的处理方式和hdu4358有点像.我们用一个pre[x]表示约数x的倍数上次出现的位置,将查询按区间的右节点升序排序.num[i]的约数为j,如果pre[j]为0,就将pre[j]置为i;否 ...

  7. C# Windows Service服务的创建和调试

    前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录 ...

  8. HDOJ2006求奇数的乘积

    求奇数的乘积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. Servlet之编码过滤

    创建CharactorFilter类,实现javax.servlet.Filter接口: package com.caiduping; import java.io.IOException; impo ...

  10. C# Winform AutoScaleMode属性

    属性的用法: None : 禁用自动缩放.(默认时) Font :根据类使用的字体(通常为系统字体)的维度控制缩放. Dpi : 根据显示分辨率控制缩放.常用分辨率为 96 和 120 DPI. In ...