内存管理

Ⅴ. 连续内存分配

不羁的心 提交于 2019-11-30 09:29:43
计算机体系结构和内存层次 计算机体系结构 内存层次 操作系统的内存管理方式 计算机体系结构 基本的分配和释放的管理要求。cpu高速缓存,存储管理单元(MMU),内存最小访问单位8bit;32位的意思是一次可以读写32位;高速缓存用来存放会重复使用的数据,用来提高效率; 内存层次 缓存速度最快,首先去缓存找数据,若未命中则去内存中找,若仍未命中则去外存(虚拟内存)中找,这三者速度差别很大。 操作系统的内存管理 知识点:我们希望的理想状态。逻辑存储单元。 存储管理要达到的效果: 抽象:逻辑地址空间 保护:独立地址空间 共享:访问相同内存 虚拟化:更大的地址空间 操作系统中采用的内存管理方式: 重定位(relocation) 分段(segmentation) 分页(paging) 虚拟存储(目前多数系统,如Linux,采用按需页式虚拟存储) 实现高度依赖硬件: 与计算机存储架构紧耦合 MMU(内存管理单元):处理CPU存储访问请求的硬件 地址空间和地址生成 地址空间的定义 物理地址空间-硬件支持的地址空间(地址总线条数)。 起始地址为0,知道 M A X s y s MAX_{sys} M A X s y s ​ 逻辑地址空间-在CPU运行的进程看到的地址 起始地址为0,直到 M A X p r o g MAX_{prog} M A X p r o g ​ 地址是从哪里来的?

(五)Linux内存管理zone_sizes_init

不想你离开。 提交于 2019-11-30 06:28:22
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 介绍 在 (四)Linux内存模型之Sparse Memory Model 中,我们分析了 bootmem_init 函数的上半部分,这次让我们来到下半部分吧,下半部分主要是围绕 zone_sizes_init 函数展开。 前景回顾: bootmem_init() 函数代码如下: void __init bootmem_init(void) { unsigned long min, max; min = PFN_UP(memblock_start_of_DRAM()); max = PFN_DOWN(memblock_end_of_DRAM()); early_memtest(min << PAGE_SHIFT, max << PAGE_SHIFT); max_pfn = max_low_pfn = max; arm64_numa_init(); /* * Sparsemem tries to allocate bootmem in memory_present(

redis持久化机制和内存管理

倾然丶 夕夏残阳落幕 提交于 2019-11-30 06:27:20
  redis持久化方式有两种:RDB方式和AOF方式   1、RDB方式:内存快照,在指定的时间间隔对数据进行快照存储,支持在客户端直接BGSAVE或者SAVE命令来创建一个内存快照,BGSAVE会fork一个子进程将快照写入磁盘,父进程仍可处理其它命令,SAVE则执行过程中不处理其它命令;在redis.conf可以调整save配置选项来设置持久化的触发策略,当在规定时间内Redis发生了写操作的个数满足设定的条件触发持久化。   2、AOF方式:记录每次对服务器的写操作,当服务器重启时会重新执行这些命令来恢复数据,通过在redis.conf中配置appendonly yes开启AOF方式 ,通过调整appendsync参数来设置同步的策略   RDB方式优点:对性能影响小、恢复数据快,缺点:会丢失数据、fork子进程会影响提供服务的能力。   AOF方式优点:安全、可容灾、可读 缺点:文件体积大、性能损耗、数据恢复慢   redis内存管理   在redis.conf中通过maxmemory 来配置最大内存,通过maxmemory-policy来配置到达阈值的策略,可选策略如下   其中LRU (最近最少使用) 根据数据的历史访问记录来淘汰数据,LFU(历史访问次数),历史访问频率来淘汰数据,具体可参考redis官网。   reids还可以配置内存压缩

linux tomcat jvm内存优化

China☆狼群 提交于 2019-11-30 05:00:50
PermGen space:全称是Permanent Generation space。就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域 Heap space:存放Instance。 GC(Garbage Collection)应该不会对PermGen space进行清理 所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误 Java Heap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不 讨论 该区。 JVM的Heap分配可以使用-X参数设定, -Xms 初始Heap大小 -Xmx java heap最大值 -Xmn young generation的heap大小 JVM有2个GC线程。第一个线程负责回收Heap的Young区。第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。 为什么一些程序频繁发生GC?有如下原因: l 程序内调用了System.gc()或Runtime.gc()。 l 一些中间件软件调用自己的GC 方法

JVM内存管理和JVM垃圾回收机制

爱⌒轻易说出口 提交于 2019-11-30 00:13:56
你对JVM内存组成结构和JVM垃圾回收机制是否熟悉,这里和大家简单分享一下,希望对你的学习有所帮助,首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示。 JVM学习笔记 JVM内存管理和JVM垃圾回收 JVM内存组成结构 JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成,结构图如下所示: 新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象 2)栈 每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果 3)本地方法栈 用于支持native方法的执行,存储了每个native方法调用的状态 4)方法区 存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代

Python变量内存管理

半腔热情 提交于 2019-11-29 19:25:06
一、变量存在哪了? x = 10 当我们在p1.py中定义一个变量 x = 10 ,那么计算机把这个变量值10存放在哪里呢了?我们回顾计算机的三大核心组件为:CPU、内存和硬盘。一定不是CPU,那是存放在内存还是硬盘中了呢?我们再回顾变量运行的三个过程,如果我们没有使用python解释器运行p1.py这个文件,那么 x=10 很明显只是很普通的四个字符x、=、1、0。而只有Python解释器运行了这个文件,那字符进入了内存,才会有变量这个概念。也就是说变量是存放在内存当中的。 变量存放在内存中这句话太宽泛了,我们把它具体化。现在想象我们在学校(电脑内存)里上课,学校每开一个班,学校都会开辟一个教室给这个班级上课用(存放变量值10),而班级的门牌号则是(变量名x)。也就是说,对于电脑内存这个大内存,每定义一个变量就会在这个大内存中开辟一个小空间,小空间内存放变量值10,然后内存给这个小空间一个变量名x(门牌号),x指向10。 二、Python垃圾回收机制 对于p1.py,如果我们再加上一段代码 x = 11 ,大内存会开辟另一个小空间存储变量值11,把变量值绑定另一个门牌号x,但是由于之前有x,所以大内存会解除x与10的连接,让x与11连接。这个时候10由于没有了门牌号,所以成为了python眼中的垃圾,python就会处理这个垃圾,释放10的内存占用

备战九十,iOS面试题菜单,持续更新(题目及答案已上传Github)

∥☆過路亽.° 提交于 2019-11-29 19:09:04
Objective_C语言特性 (戳这里跳转到Github) 分类 扩展 代理(Delegate) 通知(NSNotification) KVO (Key-value observing) KVC(Key-value coding) 属性关键字 runloop (戳这里跳转到Github) RunLoop概念 RunLoop的数据结构 RunLoop的Mode RunLoop的实现机制 RunLoop与NSTimer RunLoop和线程 讲一下 Observer ? autoreleasePool 在何时被释放? 解释一下 事件响应 的过程? 解释一下 手势识别 的过程? 解释一下 GCD 在 Runloop 中的使用? 解释一下 NSTimer。 AFNetworking 中如何运用 Runloop? PerformSelector 的实现原理? 利用 runloop 解释一下页面的渲染的过程? 如何使用 Runloop 实现一个常驻线程?这种线程一般有什么作用? 为什么 NSTimer 有时候不好使? PerformSelector:afterDelay:这个方法在子线程中是否起作用?为什么?怎么解决? 什么是异步绘制? 分类和类拓展的区别? runtime (戳这里跳转到Github) objc在向一个对象发送消息时,发生了什么?

深入理解Flink核心技术及原理

只谈情不闲聊 提交于 2019-11-29 17:42:36
前言 Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注。本文将深入分析Flink的一些关键技术与特性,希望能够帮助读者对Flink有更加深入的了解,对其他大数据系统开发者也能有所裨益。本文假设读者已对MapReduce、Spark及Storm等大数据处理框架有所了解,同时熟悉流处理与批处理的基本概念。 文章转载自: 深入理解Flink核心技术 一.Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务: DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。 DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。 Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。 此外,Flink还针对特定的应用领域提供了领域库

CPU上下文切换

风流意气都作罢 提交于 2019-11-29 16:51:42
进程在竞争 CPU 的时候并没有真正运行,为什么还会导致系统的负载升高呢?CPU 上下文切换就是罪魁祸首。 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器(Program Counter,PC)。 CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文 。 知道了什么是 CPU 上下文,我想你也很容易理解 CPU 上下文切换 。 CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来, 然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。 而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。 根据任务的不同 ,CPU