内存碎片

Spark优化总结(三)——调参

纵然是瞬间 提交于 2020-01-19 04:30:14
文章目录 Spark优化总结(三)——调参 前言 简单示例 常用参数 JVM调参 Spark优化总结(三)——调参 前言 不要期待修改一个参数能够像魔法一样立马得到神奇的好效果!(某些时候效果确实很棒^_^)你应当把参数看作一道菜中的调味品,能够丰富味道,但主要还是得靠原材料的质量与炒菜的技艺。 开发Spark应用时,应当先优化好你的应用代码,再来思考调参优化(必要的参数的除外)。 调参是一个比较复杂的主题,不同的环境、不同的代码都会导致同样的参数产生不同的效果。建议尽量在确定您的生产环境情况后、在优化好存在明显问题的代码后,再做调参测试。 下面会列出开发中常用的部分参数,并加以解释,以作参考 简单示例 一个Spark任务提交示例 spark-submit \ --queue test_queue --master yarn --deploy-mode cluster \ --num-executors 10 --executor-memory 8G --executor-cores 4 \ --driver-memory 4G --driver-cores 2 \ --conf spark.network.timeout = 300 \ --conf spark.locality.wait = 9s \ --class com.skey.spark.app.MyApp /home

小熊派华为物联网操作系统LiteOS内核教程06-内存管理

泄露秘密 提交于 2020-01-19 00:38:13
1. LiteOS内核的内存管理 1.1. 内存管理 在系统运行的过程中,一些内存空间 大小是不确定的 ,比如一些数据缓冲区,所以系统需要提供内存空间的管理能力,用户可以在使用的时候申请需要的内存空间,使用完毕释放该空间,以便再次利用。 Huawei LiteOS 的内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。 1.2. 动态内存管理 动态内存管理,即在内存资源充足的情况下,从系统配置的一块比较大的连续内存(内存池),根据用户需求,分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。 与静态内存相比,动态内存管理的好处是按需分配,缺点是内存池中容易出现碎片 。 LiteOS动态内存支持 DLINK 和 BEST LITTLE 两种标准算法。 1.2.1. DLINK 动态内存管理算法 DLINK动态内存管理结构如下图所示: 第一部分 堆内存(也称内存池)的起始地址及堆区域总大小。 第二部分 本身是一个数组,每个元素是一个双向链表,所有free节点的控制头都会被分类挂在这个数组的双向链表中。 第三部分 占用内存池极大部分的空间,是 用于存放各节点的实际区域 。 1.2.2. BEST LITTLE 算法(重点) LiteOS 的动态内存分配支持最佳适配算法,即

Redis原理详解

寵の児 提交于 2020-01-18 21:20:07
Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的: 首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type 代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存 储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串 的,当然前提是这个字符串本身可以用数值表示,比如:"123" "456"这样的字符串。 这里需要特殊说明一下vm字段,只有打开了Redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的,该功能会在后面具体描 述。通过上图我们可以发现Redis使用redisObject来表示所有的key/value数据是比较浪费内存的,当然这些内存管理成本的付出主要也 是为了给Redis不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用,我们随后会具体讨论。

堆和栈的区别

社会主义新天地 提交于 2020-01-18 14:17:26
void f() { int* p=new int[5]; }   这条短短的一句话就包含了堆与栈,看到 new ,我们首先就应该想到,我们分配了一块堆内存,那么指针 p 呢?他分配的是一块栈内存,所以这句话的意思就是: 在栈内存中存放了一个指向一块堆内存的指针 p 。在程序会先确定在堆中分配内存的大小,然后调用 operator new 分配内存,然后返回这块内存的首地址,放入栈中 , VC6 下的汇编代码如下: 00401028 push 14h 0040102A call operator new (00401060) 0040102F add esp,4 00401032 mov dword ptr [ebp-8],eax 00401035 mov eax,dword ptr [ebp-8] 00401038 mov dword ptr [ebp-4],eax 堆和栈究竟有什么区别? 主要的区别由以下几点:    1 、管理方式不同;    2 、空间大小不同;    3 、能否产生碎片不同;    4 、生长方向不同;    5 、分配方式不同;    6 、分配效率不同;    管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生 memory leak 。   空间大小:一般来讲在 32 位系统下,堆内存可以达到 4G

/proc/sys/net/ipv4/下各项的意义

梦想与她 提交于 2020-01-18 06:50:56
/proc/sys/net/ipv4/icmp_timeexceed_rate 这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。 /proc/sys/net/ipv4/igmp_max_memberships 主机上最多有多少个igmp (多播)套接字进行监听。 /proc/sys/net/ipv4/inet_peer_gc_maxtime 求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies. /proc/sys/net/ipv4/inet_peer_gc_mintime 每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候,调整这个间隔很有效。以jiffies计。 /proc/sys/net/ipv4/inet_peer_maxttl entries的最大生存期。在pool没有内存压力的情况下(比如

jvm总结

旧街凉风 提交于 2020-01-18 04:07:41
jvm内存图 方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是 线程私有的内存区域。 1、java对(heap) 是java虚拟机管理内存的最大的一块,是所有线程共享的一块区域,在虚拟机启动时创建,此内存的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配 2、方法区(Method Area) ,和堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息,常量,静态变量,及时编译器编译后的代码信息 3、程序计数器 ,是线程私有的,是一块内存较小的空间,作用是当前线程所执行的字节码的行号 指示器。(就相当于拿着一个车牌信息去找车的感觉) 4、JVM栈(JVM Stacks) ,与程序计数器一样,是线程私有的,生命周期与线程相同,虚拟机栈描述的是Java方法执行的 内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部 变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程, 就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 5、本地方法栈 (Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就 是字节码)服务

proc/sys/net/ipv4/下各项的意义

别来无恙 提交于 2020-01-18 03:21:31
/proc/sys/net/ipv4/icmp_timeexceed_rate 这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。 /proc/sys/net/ipv4/igmp_max_memberships 主机上最多有多少个igmp (多播)套接字进行监听。 /proc/sys/net/ipv4/inet_peer_gc_maxtime 求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies. /proc/sys/net/ipv4/inet_peer_gc_mintime 每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候,调整这个间隔很有效。以jiffies计。 /proc/sys/net/ipv4/inet_peer_maxttl entries的最大生存期。在pool没有内存压力的情况下(比如

JVM垃圾回收

独自空忆成欢 提交于 2020-01-17 18:16:33
上文回顾: 《 深入理解Java内存模型(JMM)》 写在前面 本节常见面试题: 问题答案在文中都有提到 如何判断对象是否死亡(两种方法)。 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 如何判断一个常量是废弃常量 如何判断一个类是无用的类 垃圾收集有哪些算法,各自的特点? HotSpot为什么要分为新生代和老年代? 常见的垃圾回收器有那些? 介绍一下CMS,G1收集器。 Minor Gc和Full GC 有什么不同呢? 本文导火索 当需要排查各种 内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 1 揭开JVM内存分配与回收的神秘面纱 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 JDK1.8之前的堆内存示意图: 从上图可以看出堆内存分为新生代、老年代和永久代。新生代又被进一步分为:Eden 区+Survivor1 区+Survivor2 区。值得注意的是,在 JDK 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域(永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制)。 1.1 对象优先在eden区分配

JVM

北城余情 提交于 2020-01-16 20:04:22
JVM 主要流程图 Java源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语义分析和生成class文件 编译时期-语法糖 语法糖可以看做是编译器实现的一些“小把戏”,这些“小把戏”可能使得效率大大提升 其中最值得说的就是泛型了,这个语法糖可以说被我们经常使用的 泛型只会在Java源码中存在,编译过后会被替换为原来的原生类型(Row Type,也称为裸类型)。这个过程叫做:泛型擦除 有了泛型这个语法糖后 代码更加简洁【不用强制类型转换】 程序更加强壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException】 可读性和稳定性【在编写集合的时候,就限定了类型】 JVM实现跨平台 至此,我们通过javac.exe编译器来编译我们的.java文件生成出.class文件 这些.class文件很明显是不能直接运行的,它不像C语音(编译cpp后生成exe文件直接运行) 这些.class文件是交由JVM来解析运行的 JVM是运行在操作系统之上的,每个操作系统的指令是不同,而JDK是区分操作系统的,只要你的本地系统装了JDK,这个JDK就是能够和当前系统兼容的。(jdk是区分平台的,class文件会被翻译成不同的平台的机器编码) class字节码运行在JVM之上,所以不用关系class字节码是在哪个操作系统编译的,只要符合JVM规范,那么

堆和栈的区别 (转贴)

梦想与她 提交于 2020-01-16 05:30:38
非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *