前言
这里再次强调一遍,spark性能调优最重要的只有两个:
- 数据序列化
- 内存调优
上一篇博客已经详细介绍了数据序列化性能调优,本文主要针对内存调优进行讲解。
说白了就是减少数据对内存的占用
内存调优概述
调整内存使用时有三个考虑因素:对象使用的内存量(您可能希望整个数据集都能容纳在内存中)、访问这些对象的成本以及垃圾收集的开销(如果您的对象周转率很高)。
默认情况下,Java对象访问速度很快,但很容易消耗比其字段中的“原始”数据多2-5倍的空间。这是由于以下几个原因造成的:
- 每个不同的Java对象都有一个“对象头”,大约有16个字节,包含指向其类的指针等信息。对于一个数据很少的对象(比如一个Int字段),它可能比数据大。
- Java字符串在原始字符串数据上有大约40个字节的开销(因为它们将其存储在Chars数组中,并保留额外的数据(如长度)),并且由于string内部使用UTF-16编码,因此将每个字符存储为两个字节。因此,一个10个字符的字符串可以容易地消耗60个字节。
- Java字符串在原始字符串数据上有大约40个字节的开销(因为它们将其存储在Chars数组中,并保留额外的数据(如长度)),并且由于string内部使用U