内存管理

Linux 内存管理一

别来无恙 提交于 2020-01-31 11:03:20
疫情在家,整理下以前的学习笔记, 作为linux 三个最重要的部分之一(进程,io,内存),内存管理是非常重要的,是深入理解linux各个部分的基础,linux的内存管理与其他rtos的内存管理不一样,他是一个“富” os,也就是支持很多的应用同时跑,还需要支持应用之间的内存隔离。Linux 内存不仅仅用于内存,比如作为硬盘的补充,硬盘本身也可以作为内存来使用。 硬件原理和分页管理 只要我们打开了MMU之后,CPU只能看到虚拟地址,最终这个虚拟地址通过MMU根据页表查询到对应的硬件地址。比如要访问虚拟地址0x1234560,其中0x560 是页内偏移, 0x1234 是页号, 比如查到0x1234 对应的物理地址是1G,CPU访问0x1234560 的时候,实际访问的是1G+0x560 的地址。 物理地址是页表下面的一个数值,所以物理地址本质上是一个整数,而不是指针。地址是以*p访问到的,其实从linux中物理地址的数据类型也可以看出来 页表除了可以查虚拟地址对应的物理地址以外,还承担了一项非常重要的权限管理(RWX),RWX指读写执行权限,对linux安全非常重要,比如代码段映射为只读读加可执行,那么无论是应用还是内核里面的任何错误行为都不会改写代码段,只要一改写硬件就会发生page fault,软件的错误行为就会被硬件拦截,硬件里面还可以管理另外一个重要的权限

OC-内存管理-NSTimer

风流意气都作罢 提交于 2020-01-31 05:34:07
NSTimer 就是我们的定时器 可以满足我们很多业务需求 ,但是它会带来内存泄漏的隐患. 场景:在一个VC中设定一个全局定时器定时打印log,需要在pop该VC的时候 清除定时器 减少内存泄露 解决如下: 001 生命周期 处理 - ( void )didMoveToParentViewController:(UIViewController *)parent{ NSLog(@"didMoveToParent==%@",parent); //parent 就是当前的视图控制器的UINavigationController if (parent == nil ) { [ self .timer invalidate]; self .timer = nil ; } } 002 设置消息转发 @property ( nonatomic , strong ) id target; class_addMethod([_target class], @selector(fire), (IMP)fireImp,"V@:"); self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:_target selector:@selector(fire) userInfo:nil repeats:YES]; [[NSRunLoop

JVM内存管理和GC

匆匆过客 提交于 2020-01-30 18:55:46
JVM内存管理以及垃圾回收。 1、虚拟机垃圾收集所关注的区域 垃圾收集只关注 堆 和 方法区 两个运行时数据区域 其他区域程序计数器、虚拟机栈、本地方法栈这些都是随线程而生,随线程而亡的。 2、自动垃圾手机的前提是要知道哪些内存可以被释放和回收。 对于实例收集监测主要有两种基本算法, 引用计数 和 可达性分析 1、引用计数算法 为对象添加一个引用计数器,没被引用一次计数器加一,引用被释放则计数器减一。当计数器为0的时候即表示对象可被回收。 缺点 引用计数存在一个基本难题,也就是很难处理循环引用的问题 2、可达性算法。 (1) 将对象及其引用关系看做一个图,选定活动的对象作为GC Roots,然后跟踪引用链条,如果一个对象和GC Roots之间不可达,也就是不存在引用链条,那么就可认为这个对象是可回收对象。 (2) 那么哪些对象可以被选 做为GC Roots呢 ? 1、JVM会把虚拟机栈中引用的对象。 2、本地方法栈中引用的对象。 3、静态属性引用的对象。 4、常量。 3、常见的垃圾手机算法。 (1)标记-清楚(Mark-Sweep)算法。 这个算法分两步走“标记”和“清除”,标记出所有要回收的对象,然后进行清除。这是最基础的收集算法,其他收集算法都是基于他再改进的。 缺点 标记和清除过程效率有限,另外就是不可避免出现碎片化问题。 (2)复制算法 背景 为了解决方法(1)的效率问题。

Netty4 中的内存管理

馋奶兔 提交于 2020-01-30 15:29:21
在Netty4中引入了新的内存管理机制极大地提升其性能,本文将对该内在管理机制进行剖析。 这里 有篇文章 讲述了在推特(Twitter)内部 使用Netty的状况以及Netty4所带来的性能收益。 在分析Netty4的 PooledByteBufAllocator 之前,我们最好先认识一下 jemalloc 。 Netty在4.0之前的版本已经尝试过通过优化内存管理的方式来提高性能(如果我没有记错的话),但4.0中的改进则特别 显著。在这个版本中,其内存管理实现主要是参考了 jemalloc 。 jemalloc jemalloc 是由Jason Evans在FreeBSD项目中引入的,其主旨是为了提升在并发环境下内存的分配效率。说白了就是替代 malloc 。malloc之所以没有照顾到并发环境,那是由于在那个时代并发还只在理论,未曾普及。而现在则是多核的天下,连 手机都动则2、4核,甚至于8核了。与jemalloc齐名的还有Google的 tcmalloc ,其 实现与jemalloc多少也有点相似,这里不做介绍。 jemalloc的理念 我们以买火车票为例,来简单地说明一下jemalloc与malloc的区别。原来的malloc,相当于只有一个售票窗口的售票大厅, 而jemalloc则在同一个售票大厅里面适量地增加的窗口。当然,火车票的总量(即内存大小)是不变的

NETTY 4的内存管理(一)

好久不见. 提交于 2020-01-30 14:37:37
https://blog.twitter.com/2013/netty-4-at-twitter-reduced-gc-overhead http://www.infoq.com/news/2013/11/netty4-twitter Reducing GC pressure and memory bandwidth consumption A problem was Netty 3’s reliance on the JVM’s memory management for buffer allocations. Netty 3 creates a new heap buffer whenever a new message is received or a user sends a message to a remote peer. This means a ‘new byte[capacity]’ for each new buffer. These buffers caused GC pressure and consumed memory bandwidth: allocating a new byte array consumes memory bandwidth to fill the array with zeros for safety. However, the

C++内存管理与注意事项

被刻印的时光 ゝ 提交于 2020-01-30 13:32:11
内存是程序运行必不可少的资源,由操作系统分配和管理。作为程序员,我们通常做的只能是申请和归还。本文主要介绍C++内存的申请和释放(归还),以及注意事项。 1 申请和释放内存的运算符 申请 new 释放 delete 2 方法 申请内存: int *p = new int; // 定义一个指针,来接收new申请到的地址 释放内存: delete p; 块内存的申请和释放: //申请 int *arr = new int[10]; //释放 delete []arr;   3 注意事项 3.1 配套使用 我们知道在c语言中内存的申请和释放是malloc 和free完成: //申请 void *malloc(size_t size); //释放 void free(void *memblock); 但是在C++中使用的是new和delete;如果使用C语言的方式申请,就得用C语言的方式释放;使用C++的方式申请,就得用C++的方式释放;配套使用。否则无法通过编译。 3.2 内存可能申请失败,需要有异常处理 int *p = new int[1000]; if (NULL == p) { //内存分配失败 } 3.3 释放内存需要将指针置为空 int *p = new int[1000]; if (NULL == p) { //内存分配失败 //异常处理 } delete []p; /

Cocos UI的内存管理

浪子不回头ぞ 提交于 2020-01-28 17:29:31
寒假回家期间,在家下了一份cocos源码,在阅读的过程中也整理一下cocos的架构设计和实现,顺便也起到为国隔离的作用。 这次先讲一讲cocos对于UI元素的内存管理机制。之后本专栏还会写一些cocos其他模块的解析,例如渲染、事件分发等。 众所周知,C++是一种比较底层的语言,由于它目前还不支持垃圾回收机制,因此在堆上分配一个对象之后,必须在代码逻辑中由delete回收,否则就会导致内存泄漏问题。尤其对于游戏引擎来说,如果在每一帧的循环代码中出现内存泄漏,很容易内存就会爆掉。 来源: https://www.cnblogs.com/wickedpriest/p/12238338.html

浅谈swift中的内存管理

痞子三分冷 提交于 2020-01-28 13:31:06
Swift使用自动引用计数(ARC(Automatic Reference Count))来管理应用程序的内存使用。这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理。当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。 内存管理 :针对的是实例的内存占用的管理(放在堆里面) 实例:1:由class类型构建的实例,2:闭包对象 下面我们来写一个实例来证明一下 class Person { var name: String init(name: String ) { self.name = name } //类被销毁时,会调用这个方法 deinit { print("\(name) person deinit") } } // var p: Person? = Person(name: "张三") p = nil//"张三" person deinit 当一个事例化的对象被赋予nil的话,会调用的 deinit(),代表着这个对象被销毁 class Person { var name: String init(name: String ) { self.name = name } //类被销毁时,会调用这个方法 deinit { print("\(name) person deinit") } } // var p: Person? =

MNN框架学习(三):内存管理

六月ゝ 毕业季﹏ 提交于 2020-01-27 15:07:07
不知道是不是借鉴了NCNN的代码,感觉差不多,具体可以参考大佬对于ncnn内存管理代码的解析,具体见参考资料[1],讲的非常清楚,这里只是做一个学习笔记。 具体代码为source/core/MNNMemoryUtils.c文件: 1、对齐内存分配接口:使用malloc函数 // 使用malloc函数来进行内存分配 // 传入待分配内存大小,及对齐内存大小 void *MNNMemoryAllocAlign(size_t size, size_t alignment) 首先,需要分配原始内存: void **origin = (void **)malloc(size + sizeof(void *) + alignment); 这里多分配的sizeof(void*)用于保存对齐前内存地址;多分配的alignment为了保证对齐后,依然有size大小内存可用;转换成(void**)的原因,是为了后面origin+1直接跳过用于保存对齐前内存地址的预留内存。 然后,对齐分配的内存: static inline void **alignPointer(void **ptr, size_t alignment); 对应实现部分为: (void **)((intptr_t)((unsigned char *)ptr + alignment - 1) & -alignment);

Android内存优化杂谈

≡放荡痞女 提交于 2020-01-27 05:43:50
Android内存优化是我们性能优化工作中比较重要的一环,这里其实主要包括两方面的工作: 优化RAM,即降低运行时内存。这里的目的是防止程序发生OOM异常,以及降低程序由于内存过大被LMK机制杀死的概率。另一方面,不合理的内存使用会使GC大大增多,从而导致程序变卡。 优化ROM,即降低程序占ROM的体积。这里主要是为了降低程序占用的空间,防止由于ROM空间不足导致程序无法安装。 本文的着重点为第一点,总结概述降低应用运行内存的技巧。在这里我们不再细述PSS、USS等概念与Android应用的内存管理,如对这部分内容感兴趣,可自行阅读文末的参考文章。 内存泄露的检测与修改 内存泄露:简单来说对象由于编码错误或系统原因,仍然存在着对其直接或间接的引用,导致系统无法进行回收。内存泄露,容易留下逻辑隐患,同时增加了应用内存峰值与发生OOM的概率。它属于bug issue,是我们一定要修改的。 下面是造成内存泄露的一些常见原因,但是如何建立一套发现内存泄露、解决内存泄露的闭环方案,才是我们工作的重点。 一. 内存泄露的监控方案 Square的开源库leakcanry是一个非常不错的选择,它通过弱引用方式侦查Activity或对象的生命周期,若发现内存泄露自动dump Hprof文件,通过HAHA库得到泄露的最短路径,最后通过notification展示。 内存泄露判断与处理的流程如下图