内存池

共享池中保留池的调整(shared_pool_reserved_size)

試著忘記壹切 提交于 2020-03-05 05:39:05
--************************************************* -- 共享池中保留池的 调 整 (shared_pool_reserved_size) --************************************************* 1 . 何 谓 保留池 简 言之,保留一部分 内 存空 间 以 备 不 时 之需。通常情 况 下, Oracle 会将 大的 内 存 请 求分割成小的 内 存 块来满 足需求。而 对 于大的 内 存且 为连续 的 内 存空 间请 求,如果在共享池中未找到, 则会动 用 共享池中的保留池。 当 然,共享池在 内 存 压 力的情 况 下,也 会 使用到 保留池中的部分。保留池部分 满 足 较 大的 内 存需求更高效。缺省情 况 下, Oracle 会 配置 较 小的保留池, 这 部分可以用作 PL/SQL 或 触发 器 编译 使用或用于装 载 JAVA 对 象的 临时 空 间 。 这 些分配出去的 内 存一旦 释 放后 将 返回 给 保留池。 任意大于 "_shared_pool_reserved_min_alloc = 4400" 字 节 的 连续内 存分配 请 求,如果 shared_pool 中分配不能解 决 ,且 当 前 shared_pool 中 没 有可用的 块 能 够 aged

nginx内存池实现原理

安稳与你 提交于 2020-03-03 08:58:19
内存池,顾名思义,是对内存块进行管理的一套工具。通过内存池的封装,我们可以非常方便的从内存池中申请和释放内存,而且由于内存池的内存块是预申请的,这就减少了我们频繁申请系统内存空间的消耗。nginx就实现了一个内存管理工具 ngx_pool_t ,专门用于对nginx运行过程中的内存进行管理。本文首先会对nginx的内存池主要特点进行讲解,然后会详细讲解其数据结构,最后会从源码的角度对 ngx_pool_t 的实现原理进行讲解。 1. 主要特点 nginx的内存池 ngx_pool_t 的主要特点如下: 由于nginx处理请求的过程中,主要是频繁的申请小块的内存,因而 ngx_pool_t 会提前申请好供小块内存使用的内存块; 在c语言开发过程中,程序员经常会忘记释放内存块,因而nginx框架本身则对内存池的释放工作进行了管理,当我们需要自定义模块开发的时候,只需要从 ngx_pool_t 中申请内存即可; 由于不同的内存的使用周期不同,比如用于nginx运行所需的内存空间,其生命周期必须与nginx整个生命周期相同,而用于处理请求的内存空间,则在一次请求处理完成之后就需要释放。因而nginx主要预定义了三种生命周期的内存块:请求级别的内存池、连接级别的内存池和模块级别的内存池。当我们需要自定义模块时,只需要根据自身的需求,选择合适的内存池进行内存的申请即可; 2. 实现原理 在介绍

python面试1000题之7-8

你离开我真会死。 提交于 2020-03-02 18:52:15
7 Python是如何进行内存管理的? http://developer.51cto.com/art/201007/213585.htm Python引用了一个内存池(memory pool)机制,即Pymalloc机制(malloc:n.分配内存),用于管理对小块内存的申请和释放 内存池(memory pool)的概念: 当 创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的概念就是预先在内存中申请一定数量的,大小相等 的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。 内存池的实现方式有很多,性能和适用范围也不一样。 python中的内存管理机制——Pymalloc: python中的内存管理机制都有两套实现,一套是针对小对象,就是大小小于256bits时,pymalloc会在内存池中申请内存空间;当大于256bits,则会直接执行new/malloc的行为来申请内存空间。 关于释放内存方面,当一个对象的引用计数变为0时,python就会调用它的析构函数。在析构时,也采用了内存池机制,从内存池来的内存会被归还到内存池中,以避免频繁地释放动作。 8 解释一下python的and-or语法 http://www.kuqin.com

ByteBuf和Channel和Pipeline

无人久伴 提交于 2020-03-01 22:13:02
BytetBuf ByteBuf就是JDK nio中Buffer的新轮子 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以 减少响应次数 ByteBuffer: 长度固定,一旦分配完成,它的容量不能动态扩展和收缩,当需要编码的POJO对象大于ByteBuffer的容量时,会发生索引越界异常; ByteBuffer只有一个标识位控的指针position,读写的时候需要手工调用flip()和rewind()等,使用者必须小心谨慎地处理这些API,否则很容易导致程序处理失败; ByteBuffer的API功能有限,一些高级和实用的特性它不支持,需要使用者自己编程实现。 需要的话,可以自定义buffer类型; 通过组合buffer类型,可实现透明的zero-copy; 提供动态的buffer类型,如StringBuffer一样,容量是按需扩展; 如果c<t,则n从阈值t(4MB)开始,以每次增加2倍的方式扩容,直到双倍后的大小小于c; 如果c>t,则n=c/t*t+t 无需调用flip()方法;方法反转(讲Buffer从读模式变成写模式) 常常比 ByteBuffer (JDK的)快 使用了读写两个指针,分别记录读写的位置,复杂操作更简单 堆内存和直接内存

Netty 系列之 Netty 高性能之道

纵然是瞬间 提交于 2020-02-29 19:27:47
1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用 Netty4 + Thrift 压缩二进制编解码技术,他们实现了 10W TPS(1K 的复杂 POJO 对象)的跨节点远程服务调用。相比于传统基于 Java 序列化 +BIO(同步阻塞 IO)的通信框架,性能提升了 8 倍多。 事实上,我对这个数据并不感到惊讶,根据我 5 年多的 NIO 编程经验,通过选择合适的 NIO 框架,加上高性能的压缩二进制编解码技术,精心的设计 Reactor 线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下 Netty 是如何支持 10W TPS 的跨节点远程服务调用的,在正式开始讲解之前,我们先简单介绍下 Netty。 1.2. Netty 基础入门 Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。 作为当前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于 Netty 的 NIO 框架构建。 2. Netty 高性能之道 2.1.

bullet中的内存池

空扰寡人 提交于 2020-02-26 22:08:56
1。概念(见于Baidu)  内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。  内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。 2.Bullet内存池(btPoolAllocator.h ) 内存池可以是反复的new delete更有效率,而且很有效的避免了内存碎片。btPoocclAllocator提供了一个简单的内存池,包括初始化分配足够数量的内存,申请内存等常用的方法。这个内存池比较好用于反复分配释放同一个对象,初始化了N*size(object)大小的内存,每次分配大小是一个Object。 1 class btPoocclAllocator 2 { 3 int m_elemSize; //每个对象的大小 4 int m_maxElements;//最大容量 5 int m_freeCount;//剩余的个数 6 void* m_firstFree;//每次分配的起点 7 unsigned char* m_pool; /

内存池技术详解

半世苍凉 提交于 2020-02-26 21:37:03
我们都知道频繁的动态内存分配很可能会造成大量的内存碎片和效率低下,因为需要搜索整个空闲链表找到可以被分配的内存块,而且容易造成内存泄漏等问题,那么如何解决这两个问题呢? 内存池技术带你走进这个问题的殿堂。 内存池技术首先会分配一大块内存给程序,当程序需要分配内存的时候从内存池中去获得,而且不需要去释放内存,当内存池不在用的时候释放整个内存即可,只分配,不释放,大大减少了时间。 优势: 1·效率快,无需调用malloc或者new,系统调用慢,而且搜索空闲块也慢 2·不会产生过多的内存碎片, 3·可以避免内存泄漏 nginx=NX nginx的内存池设计非常巧妙得利用了HTTP短连接的特性,为每一个HTTP请求分配一个内存块,当HTTP连接保持时,这个内存块只分配不释放,当 HTTP断开时,释放整块大内存,由于HTTP基本上连接时间都是非常短的,所以不可能会出现内存池把整个内存沾满的情况 memcached的内存池主要是针对键值对的特性进行优化的,但实现方式和nginx完全不同,这个我没有仔细研究,具体特性不详 STL的二级分配器也是一种属于只分配不释放的内存池,但是它只针对于小雨128bytes的小块内存申请和释放,大于128bytes的内存申请还是直 接调用malloc的。在使用STL过程中,默认是关闭二级分配器,如果真要使用,要通过宏来进行打开该功能。但是用这个分配器要小心

Nginx内存池仿写和测试

安稳与你 提交于 2020-02-20 04:47:29
Nginx内存池仿写和测试 【Nginx内存池源码刨析】 使用C++语言将Nginx内存池封装成面向对象内存池,将内存池的创建和销毁实现在构造函数和析构函数中。 Nginx内存池代码 ngx_mem_pool.h文件 # ifndef NGX_MEM_POOL_H # define NGX_MEM_POOL_H # include <cstdlib> # include <cstring> // Nginx内存池的主要类型定义 using u_char = unsigned char ; using ngx_uint_t = unsigned int ; // 外部资源释放结构体类型 typedef void ( * ngx_pool_cleanup_pt ) ( void * data ) ; // 回调函数指针 struct ngx_pool_cleanup_s { ngx_pool_cleanup_pt handler ; // 回调函数指针 void * data ; // 传入回调函数的实参 ngx_pool_cleanup_s * next ; // 指向下一个外部资源释放结构体类型 } ; // 大块内存的头信息 struct ngx_pool_large_s { ngx_pool_large_s * next ; // 指向下一个大块内存的头部 void *

C++内存池的管理

限于喜欢 提交于 2020-02-13 08:20:09
原帖与示例代码地址: http://www.codeproject.com/KB/cpp/MemoryPool.aspx 译者点评:一个简单的内存池实现,附有源码,简单易懂,适合入门。 概述 在c/c++中,内存分配(如malloc或new)会使用很多时间。 一个程序会随着长时间的运行和内存的申请释放而变得越来越慢,内存也会随着时间逐渐碎片化。特别是高频率的进行小内存申请释放,此问题变得尤其严重。 解决方案:定制内存池 为解决上述问题,一个(可能的)的解决方案就是使用内存池。 “内存池”在初始化时,分配一个大块内存(称 原始内存块),并且将此内存分割为一些小的内存块。当你需要请求分配内存时,则从内存池中取出事先分配好的内存,而不是向OS申请。内存池最大的优势在于: 1、极少的(甚至没有)堆碎片整理 2、较之普通内存分配(如malloc,new),有着更快的速度 额外的,你还将获得如下好处: 1、检测任意的指针是否指向内存池内 2、生成"heap-dump" 3、各种 内存泄漏 检测:当你没有释放之前申请的内存,内存池将抛出断言 如何工作? 让我们看看内存池的UML模型图: 图中简要的描述了CMemoryPool class,更多的细节请查看源码中class声明。 那么,CMemoryPool如何实际工作? 关于 MemoryChunks 正如你在UML图中所看到的

内存池的设计和实现总结(一)

回眸只為那壹抹淺笑 提交于 2020-02-13 08:19:36
  C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有以下弊端: 调用malloc/new,系统需要根据“最先匹配”、“最优匹配”或其他算法在内存空闲块表中查找一块空闲内存,调用free/delete,系统可能需要合并空闲内存块,这些会产生额外开销 频繁使用时会产生大量内存碎片,从而降低程序运行效率 容易造成内存泄漏   内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升。   本章先实现一个简单的内存池(CSingleMemoryPools)。该内存池提供一定数量、大小相等的内存块。该实例中,CSingleMemoryPools中的m_pMemoryFreeList负责对空闲内存块进行管理,每个内存块以_MemoryBlock类进行管理,其中首部有4个字节的指针块地址 + 4个字节的list表首地址 + 4位验证码,然后才是分配的内存。 1 #pragma once 2 3 //开发一个简单的内存池,用于内存管理。 4 5 #include