内存碎片

redis4支持内存碎片清理功能使用

你说的曾经没有我的故事 提交于 2021-01-20 00:05:28
最近看到redis4支持内存碎片清理了, 之前一直期待有这么一个功能, 因为之前遇到内存碎片的解决办法就是重启, 现在终于有了优雅的解决方案.\^o^/, 这个功能其实oranagra 在2017年1月1日已经提交pr了, 相关地址: https://github.com/antirez/redis/pull/3720 版本说明: Redis 4.0-RC3 以上版本才支持的 需要使用jemalloc作为内存分配器(默认的) 功能介绍: 支持在运行期进行自动内存碎片清理 (config set activedefrag yes) 支持通过命令 memory purge 进行清理(与自动清理区域不同) 功能验证流程: (1) 首先需要拉取4.0-RC3之后的版本代码, 编译 (2) 启动时限定内存大小为1g并启动lru, 命令如下: ./src/redis-server --maxmemory 1gb --maxmemory-policy allkeys-lru --activedefrag no --port 6383 (3) 构造大量数据并导致lru, 这样可以触发内存碎片, 命令如下: redis-cli -p 6383 debug populate 7000000 asdf 150 (4) 查看当前的内存使用情况, 会发现有200多万的数据被清理掉了 $ redis-cli

JVM内容整合

爱⌒轻易说出口 提交于 2020-04-08 00:48:55
前言: JVM全称Java Virtual Machine是虚构的计算机,也是因此Java才可在各个系统平台运行,本文内容篇幅较长主要分为JVM整体流程,内存划分及组成以及JVM机制等方面进行介绍     一、JVM整体流程 一个java文件执行的大致步骤流程如下: 一张复杂的JVM架构图:   JVM加工类过程 加载 将class字节码文件加载进虚拟机,存储至元空间的方法区内 验证 文件格式验证 元数据验证 字节码验证 符号引用验证 准备 为类变量(static修饰)分配内存并设置初始值(指JVM默认值,例如:引用类型为null,int类型为0,不是类中指定的值) 如果类变量被final修饰,则直接赋类中定义的默认值(特殊情况:该final静态变量如果需要计算,会导致初始化) 成员变量(实例变量、属性、属于对象)不分配内存 解析 将常量池的符号引用转为直接引用(由于java为值传递,去掉了指针) 初始化 给类变量赋值(类中定义的默认值) 初始化静态语句块   相关题目测试 class GrandParent3{ static { System.out.println("GrandParent3静态代码块"); } } class Parent3 extends GrandParent3{ public final static String parent3="hello

C语言进阶之路(一)----C语言的内存四区模型

这一生的挚爱 提交于 2020-04-07 21:51:32
1.内存四区模型: 操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域: 1.1栈区(stack):栈stack是一种先进后出的内存结构,所有的局部变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出,用完由操作系统自动释放 1.2堆区(heap):堆区需要程序员手动分配,手动释放,在C语言中可使用malloc进行分配。 1.3数据区: 静态区:全局变量以及程序中的静态变量。 常量区(static):字符串、常量。C编译器对于相同的字符串会自动进行优化分配为统一的地址。 1.4代码区: 存放程序的二进制代码,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段,这块内存是不可以在运行期间修改的。 例子: //main.cpp int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 ,编译时将"abc"存储到常量区,运行时将常量区的值拷贝靠栈区。 char *p2; //栈 char *p3 = "123456"; //123456\\0在常量区,p3在栈上。 static int c =0;//全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *

实现malloc-free用来管理64k内存

怎甘沉沦 提交于 2020-04-07 12:21:38
问题的引入 实现malloc-free,用来管理64k的内存。这是一道面试题,也是一道很好的设计题 解决思路 1.malloc(size_t size), free(void *p)是用户api, 释放的时候需要知道释放空间的大小,并且需要放入到一个空闲链表里面去,可以这样设计 typedef struct item{ uint16_t size; union { char mem[4]; struct item *next; }mn; }__attribute__ ((packed)) item; 2.采用union,如果分配给用户,则为可以使用内存,加入到空闲链表,则为链表指针。这里的指针大小为4个字节,因此分配给用户的最小长度为4字节,如果用户申请的长度小于4个字节,应该分配4个字节。 如果为16位机器,则应该将联合体改为union {char mem[2];struct item *next;}mn; 3.为了避免内存碎片,这里需要将释放的两个相邻的区域拼接成一个较大的空间,设计一个splice函数。 4.申请,首先找到第一个比申请内存大的空间,然后划分一部分分配给用户,划分函数为cut. 实现 define ITEM_SIZE (sizeof(item) - sizeof(void *)) typedef struct item{ uint16_t size; union

Java虚拟机详解04----GC算法和种类【重要】

主宰稳场 提交于 2020-04-07 05:39:06
本文主要内容: GC的概念 GC算法     引用计数法(无法解决循环引用的问题,不被java采纳)   根搜索算法   现代虚拟机中的垃圾搜集算法:       标记-清除       复制算法(新生代)       标记-压缩(老年代)   分代收集 Stop-The-World 一、GC的概念: GC:Garbage Collection 垃圾收集 1960年 Lisp使用了GC Java中, GC的对象是Java堆和方法区 (即永久区) 我们接下来对上面的三句话进行一一的解释: (1)GC:Garbage Collection 垃圾收集。这里所谓的垃圾指的是 在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM 。 在C/C++里是由程序猿自己去申请、管理和释放内存空间,因此没有GC的概念。而在Java中, 后台专门有一个专门用于垃圾回收的线程 来进行监控、扫描,自动将一些无用的内存进行释放,这就是垃圾收集的一个基本思想, 目的在于防止由程序猿引入的人为的内存泄露 。 (2)事实上,GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? (3)内存区域中的

直通大厂:Java必考系列——JVM经典面试题目(含答案)

五迷三道 提交于 2020-04-06 23:22:00
Q1:类的加载机制是什么? 答:类加载到内存中主要有5个阶段,分别为 ①加载:将Class文件读取到运行时数据区的方法区内,在堆中创建Class对象,并封装类在方法区的数据结构的过程。 ②验证:主要用于确保Class文件符合当前虚拟机的要求,保障虚拟机自身的安全,只有通过验证的Class文件才能被JVM加载。 ③准备:主要工作是在方法区中为类变量分配内存空间并设置类中变量的初始值。④解析:将常量池中的符号引用替换为直接引用。 ⑤初始化:主要通过执行类构造器的<client>方法为类进行初始化,该方法是在编译阶段由编译器自动收集类中静态语句块和变量的赋值操作组成的。JVM规定,只有在父类的<client>方法都执行成功后,子类的方法才可以被执行。在一个类中既没有静态变量赋值操作也没有静态语句块时,编译器不会为该类生成<client>方法。 Q2:有哪些类加载器,类加载器的加载模型是什么,有什么好处? 答:①主要有启动类加载器,负责加载JAVA_HOME/lib中的类库;扩展类加载器,负责加载JAVA_HOME/lib/ext中的类库;应用程序类加载器,也称系统类加载器,负责加载用户类路径上指定的类库;也可以自定义类加载器。②类加载器之间的层次关系叫做双亲委派模型,要求除了顶层的启动类加载器外其余的类加载器都应当有自己的父类加载器。一个类收到类加载请求后会层层找父类加载器去尝试加载

GC 算法与种类

旧时模样 提交于 2020-04-05 22:01:25
对于垃圾收集(GC), 我们需要考虑三件事情:哪些内存需要回收?如何判断是垃圾对象?垃圾回收算法有哪些? 一、GC的工作区域 1、不是GC的工作区域 (1)程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭; (2)栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具有确定性。 在这几个区域不需要过多考虑回收的问题,因为方法结束或线程结束时,内存自然就跟随着回收了。 2、GC的工作区域(哪些内存需要GC回收?) (1)垃圾回收重点关注的是堆和方法区部分的内存。 因为一个接口中的多个实现类需要的内存可能不一样,一个方法的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间才能知道会创建哪些对象,这部分内存的分 配和回收都是动态的,所以垃圾回收器所关注的主要是这部分的内存。 二、垃圾对象的判定 Java堆中存放着几乎所有的对象实例,垃圾收集器对堆中的对象进行回收前,要先确定这些对象是否还有用,哪些还活着。对象死去的时候才需要回收。 1、引用计数法 引用计数法的逻辑是:在堆中存储对象时,在对象头处维护一个counter计数器,如果一个对象增加了一个引用与之相连,则将counter++。 如果一个引用关系失效则counter–。如果一个对象的counter变为0

简要概括内存机制

南笙酒味 提交于 2020-04-04 12:58:09
1-逻辑地址 为什么要引入逻辑地址? 逻辑地址是虚拟的,并非真实的物理地址。逻辑地址是写在程序中的,因为程序是写死的,不方便更改,而实际使用中内存是变化的,如果直接在程序中写物理地址,会引发错误,因此引入逻辑地址。 程序无法得知可用的物理地址,所以必须做出映射。 2-逻辑地址和物理地址如何完成映射 一种简单的思路:固定偏移量 缺陷: 在实际使用中,程序1内存的实际使用量通常小于200,余下的内存成为内碎片 程序1如果运行完,程序3要运行,但需要201内存,那么200那块内存就会被浪费,被称为外碎片 解决办法:分页 二者如何建立联系?需要一张中间表,称为page table,程序中的page -> page frame进行映射 补充知识 分页优化 参考:B站 https://www.bilibili.com/video/BV1u7411z7Sv?from=search&seid=9878274338412530575 来源: https://www.cnblogs.com/tudoo/p/12626898.html

oracle 常用调优方法

你。 提交于 2020-04-02 05:57:25
Oracle 数据库应用系统的调优主要包括十个方面: (1)、优化 数据库 内存; (2)、在Oracle共享池中固定应用程序代码; (3)、优化数据存储; (4)、优化数据排序的技术; (5)、优化 SQL 语句; (6)、优化回退段; (7)、优化索引; (8)、优化磁盘I/O; (9)、定期生成数据库对象的状态统计信息; (10)、优化操作系统环境。 其实质就是降低CPU负载、改善I/O性能。 1、化磁盘I/O 数据库的作用就是实现对数据的 管理 和查询,所以必然存在对数据的大量读写操作,其I/O问题也往往是导致Oracle数据库性能问题的重要原因。 1.1、Oracle中I/O的产生 1.2、优化OS存储 一、在UNIT环境下,采用裸设备(Raw Device)作为Oracle数据文件的存储设备比采文件系统(File System)存储Oracle数据文件具有较高的读写效率。 二、采用异步IO(Asynchronous IO)方式。在异步IO模式下,进程发出IO请求后无需等待IO完成,可以去处理其它事情;IO请求被放入一个队列中,一旦IO完成,系统会发出信号通知进程。异步IO可以使需要大量写的Oracle进程(如DBWn进程)将IO请求队列化,以充分利用硬件的IO带宽,从而使它们能最大程度实现并行处理。确认操作系统已经设置支持AIO后,还需要设置Oracle初始化参数

Memcached内存缓存技术

北战南征 提交于 2020-04-01 15:17:06
Memcached是什么,有什么作用? Memcached是一个开源的、高性能的内存缓存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思。 Memcached通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以减少业务直接对数据库的访问,从而减轻数据库的访问压力和网站集群的响应速度。 Memcached服务在企业集群架构中应用场景 1.作为数据库的前端缓存应用 完整缓存(易):例如商品分类,以及商品信息,可实现放到内存里,然后再对外提供数据访问。这个被称之为预热。用户访问时可以只读取memcached缓存,不读取数据库了。 热点缓存(难):需要前端程序配合。只缓存热点的数据,即缓存经常被访问的数据。先预热基础数据,然后再动态更新。程序先读取缓存,如果缓存里没有对应的数据,程序再去读取数据库,然后程序把读到的数据放入缓存。 特殊说明: 如果碰到电商秒杀等高并发的业务,一定要事先预热,或者其他思想实现,例如:秒杀只是获取资格,而不是瞬间秒杀到手商品。如果数据更新,要同时触发缓存更新,防止给用户过过期数据。 2.作为集群的session会话共享存储 优点:速度比files块,可以解决共用session问题 缺点:不能持久化,只能单点部署,多点数据无法同步,即使用hash分配节点,也会有session丢失 Memcached服务在不同企业业务应用场景中的工作流程 1