内存碎片

面试题:缓存Redis与Memcached的比较 有用

寵の児 提交于 2020-01-01 05:11:37
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象来减少读取数据库的次数, 从而提供动态、数据库驱动网站的速度. Memcached基于一个 存储键/值对的hashmap 。 Redis是一 个key-value存储系统 ,和Memcached类似。但是它支持存储的value类型相对更多, 包括string(字符串)、 list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型) 。 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都 是原子性的 。在此基础上 ,redis支持各种不同方式的排序 。与memcached一样, 为了保证效率,数据都是缓存在内存中。区别的是 redis会周期 性的把更新的数据写入磁盘或者 把修改操作写入追加的记录文件 ,并且在此基础上实现了master-slave(主从)同步。 Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便. 下面主要介绍一下Redis与Memcached的不同。

JavaEE实训----------购物网站

a 夏天 提交于 2019-12-31 02:35:08
JavaEE实训 ---------- 购物网站 第一话-------今天主要是一些基础知识比如spring和springmvc的环境搭建,java内存,spring中的IOC控制反转和DI依赖注入 所需技术( SSM框架 Spring,SpringMVC,Mybatis)+MySQL数据库+html+css+ajax(购物车js,jquery控制)+js 正儿八经开始前,先聊几个问题。 一.java中的内存问题 ①高访问量的典型例子—春节抢票,学校选课,双11购物。这些都会引起内存的分配的问题 ②在 java中创建一个空对象 是要消耗字节的(16B);在电脑创建一个空的记事本文件需要4k。 ③Java对象在内存中的位置?------- 随即分配 随机分配会导致内存不会100%被利用,所以会造成一种现象— 内存碎片 。 Spring 很好的解决了这一问题,spring会合理地分配内存。 1.你以为的内存分布 2.实际的内存分布-------出现了内存碎片的问题 二. 一个简单的spring案例 ** ①导入相应的jar包,一般来说,有以下5个就够大多数工程了 ②在src底下创建一个application-context.xml文件 ③创建一个Java类 写个简单的hello()方法 package com.tedu.model; public class HelloSpring {

操作系统概述(二)

霸气de小男生 提交于 2019-12-29 23:09:44
操作系统内存管理 内存管理包括内存管理和虚拟内存管理。 内存管理包括程序装入等概念、交换技术、连续分配管理方式和非连续分配管理方式(分页、分段、段页式)。 虚拟内存管理包括虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集。 我们先来了解一下什么是内存: 内存是计算机系统的一个重要组成部分,只有在内存中的程序才能被CPU所执行,而且CPU运行时所需要的数据和程序运行空间都是从内存中获取,所以内存性能的好坏直接影响我们计算机性能的好坏. 讲到内存我们可以讲一下关于存储器的分类: 存储器按照功能分配可以分为高速缓冲存储器(cache),主存储器(内存),外存储器(外存): 高速缓冲存储器(cache):cache又分为一级cache和二级cache,一级cache是位于CPU内部的存储器,它负责存储并向CPU传递需要的数据和指令,二级cache位于CPU和主存储器(DRAM)之间,二级的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。CPU读取数据时,先从一级cache中寻找,找不到再从二级cache中寻找,有时还需要从三级cache中寻找.它们的共同点是读取速度都比CPU慢比内存快,内存容量小,价格高. 缓存的出现主要是为了解决CPU运算速度与内存 读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多

C#内存管理与垃圾回收

核能气质少年 提交于 2019-12-29 02:32:45
垃圾回收还得从根说起,就像生儿育女一样。 根 :根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null。根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为定义的变量就存在线程栈上,类型对象指针存在托管堆中,因为实例化一个对象要额外分配两个字段“类型对象指针”和“同步块索引”。 类型对象指针的作用 。实例化一个对象并没有为其方法分配内存,类型的静态字段分配内存,而实例要向调用属于类型的一些东西,就必须通过类型对象指针。如对象的实例是共用类型的方法,实例只需要通过类型对象指针调用类型的方法,更多关于方法的调用请看我的 这篇博客 。 同步块索引的作用 。1:用于lock,使对象在同一时刻只能一个线程访问;2:用于获取对象的hashCode;3:在垃圾回收时标志某个对象是否是垃圾。关于 lock 最经典的一个例子就是单例了,大家的实现都是实例化一个object对象,然后锁住它,然后在判断是否要实例要实现单例的那个对象。我们为什么要实例化一个object,而不是直接lock(typeof(object)),那是因为这样会把object这个类型给锁住,锁住期间,任何使用线程使用lock(typeof(object))就必须等待,object还是可以正常使用。lock能起到单线程访问的原因是:它里面有一个空的for死循环

垃圾收集器与内存分配策略(2)

天涯浪子 提交于 2019-12-29 02:32:34
3.垃圾收集算法 3.1 标记—清除算法 最基础的收集算法是“标记—清除”(Mark-Sweep)算法,如他的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。两个主要缺点:一个是效率问题,标记和清除过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集操作。 3.2 复制算法 为了解决效率问题,出现了复制算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块儿进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。这种算法代价太高,将内存缩小为原来的一半。 现在的商业虚拟机都采用这种手机算法来回收新生代,据IBM的专门研究表明,新生代中的对象98%是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor的空间

C#下内存管理--垃圾收集

左心房为你撑大大i 提交于 2019-12-29 02:32:15
章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止没有任何一种编程语言对内存管理处理的非常完美,每种语言都在兼顾性能 效率,语法语义易用性等方面折中中有所侧重。例如较之于C#,JAVA等语言C++号称不需要垃圾收集,因为C++本身产生的垃圾很少,诚然这是C++的 优势,这也就是为什么在内存受限或者效率优先的环境下优先考虑C++,但它的缺点也是明显的--程序员必须自己控制内存管理,很容易产生内存泄漏,这同时 也造就了C++很难掌握。感谢摩尔定律吧,它促使了垃圾收集这个概念的出现,但较之C++直接操纵内存释放,再牛逼的垃圾收集算法也无法抹去那一层性能上 的损失。 在讨论之前我们先明确一点:内存中数据按所处位置不同可以分为栈内存和堆内存,栈的主要作用是追踪函数调用之间的数据传递(栈上所存储 的数据类型通常是int,char,long,指针等内置值类型和struct。注意一点在多线程环境下,每个线程都有自己的栈。)所以栈的内存管理通常 由操作系统负责。而我们所说的内存管理,大都讨论的是堆上内存管理(分配在堆上的类型一般是自定义引用类型:类,接口,字符串,对象实例,C#中委托 等)。关于这一点详情请参照Under the hood of NET

GC算法与代龄

放肆的年华 提交于 2019-12-29 02:29:53
第一节. GC的算法与工作方式   1.算法   垃圾收集器的本质,就是跟踪所有被引用到的对象,整理对象不再被引用的对象,回收相应的内存。   这听起来类似于一种叫做“引用计数(Reference Counting)”的算法,然而这种算法需要遍历所有对象,并维护它们的引用情况,所以效率较低些,并且在出现“环引用”时很容易造成内存泄露。所以.Net中采用了一种叫做“标记与清除(Mark Sweep)”算法来完成上述任务。   “标记与清除”算法,顾名思义,这种算法有两个本领:   “标记”本领——垃圾的识别:从应用程序的root出发,利用相互引用关系,遍历其在Heap上动态分配的所有对象,没有被引用的对象不被标记,即成为垃圾;存活的对象被标记,即维护成了一张“根-对象可达图”。   其实,CLR会把对象关系看做“树图”,无疑,了解数据结构的同学都知道,有了“树图”的概念,会加快遍历对象的速度。   检测、标记对象引用,是一件很有意思的事情,有很多方法可以做到,但是只有一种是效率最优的,.Net中是利用栈来完成的,在不断的入栈与出栈中完成检测:先在树图中选择一个需要检测的对象,将该对象的所有引用压栈,如此反复直到栈变空为止。栈变空意味着已经遍历了这个局部根(或者说是树图中的节点)能够到达的所有对象。树图节点范围包括局部变量(实际上局部变量会很快被回收,因为它的作用域很明显、很好控制)

.Net Discovery系列之十-深入理解平台机制与性能影响(上)

不羁的心 提交于 2019-12-29 02:29:42
转眼间《.Net Discovery》系列文章已经推出1年了,本文为该系列的第10-13篇文章,在本文中将对以前所讲的.Net平台知识做一个小小的总结与机制分析,引出并重点介绍这些机制对程序性能的影响与改进建议。 本文将分为四部分,分别讲述了:垃圾回收机制、即时编译机制、异常处理机制、字符串驻驻留机制的原理与性能改进建议。《.Net Discovery》系列的每篇文章撰写耗时都在2天以上,转载时麻烦著名作者Aicken(李鸣),并且未经作者同意,禁止一切商业用途! 一.关于垃圾回收机制 ● 机制分析 垃圾收集器是.Net平台的一个特性,它自动回收托管堆上不再使用的对象,及时清理内存,这一切都是对开发人员透明的,当然你也可以手动把它召唤出来,它的本质就是跟踪所有被引用到的对象,整理对象不再被引用的对象,回收相应的内存。垃圾收集机制采用“标记与清除(Mark Sweep)”算法来完成上述任务,整个过程分为两步: Step 1.Mark-Sweep :从应用程序的root出发,利用相互引用关系,遍历其在Heap上动态分配的所有对象,指明需要回收的对象,标记出那些存活的对象,予以标记。 Step 2.Compact: 对内存中存活的对象进行移动,修改它们的指针,使之在内存中连续,这样空闲的内存也就连续了,即完成了内存释放工作,也解决了内存碎片问题,这个过程也可以成为指针的压缩。

内存管理2

北慕城南 提交于 2019-12-28 21:24:25
 可能产生外部碎片的是段式和可变分区 可能参数内部碎片的是页式段页式 固定分区 在虚拟存储方案中 常用的页面调入策略有两种请求调页和预调页 移动技术可以解决外部碎片不能解决内部碎片 页面置换策略中先进先出页面置换算法(FIFO)总是选择最先换入的页面调出 最近不常用页面置换算法(LFU)是根据页面的被调用次数来选择的 这种方法总数选择被访问次数最少的页面调出 理想页面置换算法(OPT)总数选用以后不再需要或最长时间以后才会用到的页面调出 最近最少使用页面置换算法(LRU)总是选用最长时间内来访问过的页面调出 页式存储管理方案中 将内存逻辑地址分为页号和地址两个部分 一个字节八位 三个字节24位所以地址长度为24位由于页面地址占10位所以页号占用14位 2^14=16384即进程最多有16384个页面 在某页式存储管理方案中 页面大小2kb=2^11 进程地址空间2^29=512MB 页号就占29-11=18 2^18个 固定分配局部地区置换的分配方案是基于进程的类型 为每一进程分配固定的页数的内存空间 在整个运行期间 都不再改变 采用该策略时 如果进程在运行中出现缺页 则只能从该进程的N个页面选择一个换出 然后再进入一页 以保证分配给该进程的内存空间不变 可变分区进程运行中 其内存页面可以动态增长或者减少 为每一个进程分配一定数目的内存页面 全部置换是运行的过程当其页面不够时

高性能内存对象缓存memcached

家住魔仙堡 提交于 2019-12-28 17:42:30
一、memcached简介 1.memcached是基于内存级的缓存服务器,将所有的数据都存在内存中。因为在内存中会统一维护一张巨大的hash表,所以支持任意存储类型的数据 2.memcached是C/S架构,需要安装memcached服务端和memcached API客户端 3.主要作用: memcache主要用于分担数据库的负载压力,是缓存系统,所以严格意义上来说,memcache不是一个nosql的数据库,只是一个提供内存缓存功能的系统。那怎么理解别人说的memcache又是一个nosql数据库? 首选说明一下什么是nosql(泛指非关系型数据库),关系型数据是基于二维表(实体和实体之间的关系就叫做关系型数据库),而非关系型数据库不使用SQL语句作为查询,使用key-value这种数据结构保存数据的数据库,而memcache本身是没有使用SQL语句作为查询的,所以他是nosql库。 二、memcached原理 1.当Web客户端发送请求到Web服务器的应用程序时,应用程序会通过调用Memcached API客户端程序库接口去连接Memcached服务器,进而查询数据。如果此时Web客户端所请求的数据已经在Memcached服务端中缓存,则Memcached服务端会将数据返回给Web客户端;如果数据不存在,则会将Web客户端请求发送至MySQL数据库