内存碎片

GC的前世与今生

倾然丶 夕夏残阳落幕 提交于 2019-12-24 16:39:08
GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。的确,在那个对每一个Byte都要精心计算的年代GC的速度和对系统资源的大量占用使很多人的无法接受。而后,1984年由Dave Ungar开发的Small talk语言第一次采用了Generational garbage collection的技术(这个技术在下文中会谈到),但是Small talk也没有得到十分广泛的应用。 直到20世纪90年代中期GC才以主角的身份登上了历史的舞台,这不得不归功于Java的进步,今日的GC已非吴下阿蒙。Java采用VM(Virtual Machine)机制,由VM来管理程序的运行当然也包括对GC管理。90年代末期.net出现了,.net采用了和Java类似的方法由CLR(Common Language Runtime)来管理

GC的前世与今生

寵の児 提交于 2019-12-24 16:38:54
   原文地址:http://kb.cnblogs.com/page/106720/   作者: spring yang GC的前世与今生   虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。   但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。的确,在那个对每一个Byte都要精心计算的年代GC的速度和对系统资源的大量占用使很多人的无法接受。而后,1984年由Dave Ungar开发的Smalltalk语言第一次采用了Generational garbage collection的技术(这个技术在下文中会谈到),但是Smalltalk也没有得到十分广泛的应用。   直到20世纪90年代中期GC才以主角的身份登上了历史的舞台,这不得不归功于Java的进步,今日的GC已非吴下阿蒙。Java采用VM(Virtual Machine)机制,由VM来管理程序的运行当然也包括对GC管理。90年代末期.NET出现了,

PHP运行原理

坚强是说给别人听的谎言 提交于 2019-12-24 09:28:53
PHP简介:PHP是一种适用于web开发的动态脚本语言(网页快捷开发),是用纯C语言实现的。我们可以认为PHP就是一个用C语言实现包含大量组件的软件框架。更狭义一点可以认为是一个功能强大的UI框架。 PHP的设计理念及特点 多进程模型:PHP采用多进程模型,不同请求之间互不干涉,保证了一个请求挂掉不会对其它请求和服务造成影响。当然,PHP目前已支持多线程模型; 弱类型语言:PHP是一门弱类型语言,变量的类型在定义时是不需要给定的,会在运行中根据变量的值发生隐式或是显式的类型转换,这种机制的灵活性在web开发中非常方便、高效; PHP通过引擎(zend)+组件(extension)的模式来降低内部耦合; 中间层(sapi)隔绝web server 与 PHP; 语法简单灵活,没有太多的规范,当容易导致代码风格的混乱。 PHP的四层架构(如下图) Zend引擎:也可以称之为Zend软件虚拟机,用于翻译执行PHP代码。Zend整体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode代码,并实现相应的处理方法、实现了基本的数据结构(主要的数据结构是hashtable)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。 Opcode:是一种PHP脚本编译后的中间语言

java

廉价感情. 提交于 2019-12-24 00:45:54
第十六章 Java final类不能继承、重写,final方法不能重写,final属性不能变 16.1 JVM 组成 JVM内存大致分为五个区域:方法区、虚拟机栈、本地方法栈、堆、程序计数器 **程序计数器:**记录的是正在执行的虚拟机字节码指令的地址,通过改变程序计数器,java程序才能按顺序、循环、跳转等流程执行各个方法。该区域是所有区域中唯一没有定义内存溢出错误的区域。 **虚拟机栈:**java为每个方法保存状态信息的区域,这里存放的是每个方法中的局部变量、方法出口、动态链接等,著名的栈溢出错误就是在这里发生。 **本地方法栈:**java可以执行非java函数,这些函数的状态信息就保存在这个区域,因此这个区域也有可能发生栈溢出。 **堆:**一块线程共享的存放对象实例和数组的内存区域,线程安全问题的根本原因,也是整个内存区域中最大的一块。 **方法区:**存储已被加载的类信息、常量、静态变量等,著名的常量池就位于这里。 类加载机制 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过 加载、连接、初始化 3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 **加载:**将类的class文件读入到内存,创建一个类对象的过程,加载的方法有三种: new的方式加载、调用类反射的方法加载

C/C++内存结构

牧云@^-^@ 提交于 2019-12-23 22:25:31
一、基本认识   在 C++ 中,内存分成 5 个区,他 们分别是堆、栈、自由存储区、全局 / 静态存储区和常量存储区。 栈 由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等 堆 由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete 。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 自由存储区 由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的 全局 / 静态存储区 全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的,在 C++ 里面没有这个区分了,他们共同占用同一块内存区 常量存储区 这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改 二、堆与栈的区别 堆 栈 管理方式 释放工作由程序员控制,容易产生 memory leak 由编译器自动管理,无需我们手工控制 空间大小 一般来讲在 32 位系统下,堆内存可以达到4G的空间 一般都是有一定的空间大小的,例如,在 VC6 下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改: 打开工程,依次操作菜单如下: Project->Setting->Link ,在 Category 中选中

Redis配置与优化

只谈情不闲聊 提交于 2019-12-23 18:16:18
Redis配置与优化 Redis简介 Redis基于内存运行并支持持久化 采用key-value(键值对)的存储形式 优点: 具有极高的数据读写速度 支持丰富的数据类型 支持数据的持久化 原子性 支持数据备份 Redis和mem的差别 redis:支持持久化,不支持结构化 mem : 支持结构化,不支持持久化 Redis的安装部署 #安装必要安装包 yum install gcc gcc-c++ -y #挂载必要软件包 mount.cifs //192.168.100.3/mem /mnt #解压安装包 cd /mnt tar zxvf redis-5.0.7.tar.gz -C /opt #编译安装 cd /opt/redis-5.0.7/ make make PREFIX=/usr/local/redis/ install #进入util目录,执行脚本 cd utils/ ./install_server.sh #执行后一路回车在这里添加/usr/local/redis/bin/redis-server一句 Please select the redis executable path [ ] /usr/local/redis/bin/redis-server #创建命令连接 ln -s /usr/local/redis/bin/* /usr/local/bin netstat

V8 是怎么跑起来的 —— V8 的 JavaScript 执行管道

帅比萌擦擦* 提交于 2019-12-23 10:21:26
文章创作于 2019-11-08,2019-12-20 迁移至此。 作者有话说 “V8 是怎么跑起来的” 系列是我学习 V8 过程中的总结。从一年前正式成为前端工程师开始,我便有意识地了解和学习 V8。我也发现,在技术社区中鲜有内容新鲜的、原创度高的中文资料,于是开始将我学习过程中的总结分享出来。 由于工作繁忙,我已经半年没有更新博客。这个系列的引子是 4 月写的一篇 《V8 是怎么跑起来的 —— V8 中的对象表示》 ,我们通过使用 Chrome DevTools 验证的方式介绍了 V8 中的对象表示。 本文是这个系列真正意义的第一篇文章。文章的定位是这个系列的大纲,将按照 JavaScript 在 V8 中的执行流程,顺序介绍每一步的操作,并澄清一个社区中流传甚广的 “错误”。本文不会过于深究其中的细节(后续篇章将展开),您可以在评论中留下您想了解 V8 引擎的部分,也许下一篇选题会采纳并优先介绍。 祝阅读愉快。 1. 为什么是 V8 Any application that can be written in JavaScript, will eventually be written in JavaScript. 相信很多的朋友都听过前端界的一个著名定律,叫做 Atwood’s Law 。2007 年,Jeff Atwood 提出 “所有可以用 JavaScript

JAVA虚拟机JVM的简单认识

泪湿孤枕 提交于 2019-12-22 16:58:02
以前面试的时候经常会被问到Java虚拟机的问题,面试官会问到: ------------你知道虚拟机吗? ------------虚拟机内存机构是什么样的? ------------栈区和堆区的区别你知道吗? ------------虚拟机的类加载机制你知道吗? ------------虚拟机的双亲委派机制你知道吗? ------------java虚拟机的垃圾回收你知道吗? ------------JVM的优化你知道吗?内存优化你知道吗? 等等。。。。。。。。。。不知道!。。。。好,那就先这样吧,我们会过两天通知你面试结果,先回家等着吧。就这样等到了天荒地老,也没有等到面试的结果和通知。 如果你看完这篇文章还不了解虚拟机,面试的时候还被虚拟机的问题问住,我只能说,你没有认真看。 以上内容纯属废话,请看下面: -------------------------------------------------------------------------------------------- 一、java虚拟机的认知 1、JVM是Java Virtual Machine(Java虚拟机)的缩写。 虚拟机,字面理解就是虚拟的计算机。计算机可以安装操作系统吧,所以这个虚拟的计算机里面亦可以安装操作系统,比如Windows、Linux。就可理解成,虚拟机就是一款软件

JVM垃圾收集器

无人久伴 提交于 2019-12-22 01:54:54
垃圾回收器回收哪部分内存?    关于jvm内存结构可查看另一篇随笔:https://www.cnblogs.com/shamgod-lct/p/9341567.html    程序计数器 、 虚拟机栈 、 本地方法栈 3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊的执行着出栈和入栈的操作。这几个区域不用考虑内存回收的问题,方法结束或者线程结束时,内存自然跟随者回收了。   而 Java堆 和 方法区 是线程共享的,只有在程序运行期间才能知道会创建哪些对象,这部分的内存和回收都是动态的,垃圾收集器所关注的是这部分内存。 垃圾回收器回收哪些对象? 死亡的对象(不可能再被任何途径使用的对象) 怎么判断对象是否死亡? 1.引用计数法 定义:给对象中添加一个引用计数器,有一个地方引用时,计数器就加1,引用失效时,计数器就减1,任何时刻计数器为0的对象就是不可能再被使用的。 优点:实现简单、判定效率高。 缺点: 很难解决对象之间相互循环引用的问题 。(主流的Java虚拟机都没有选用引用计数算法来管理内存) 2.可达性分析算法 定义:通过一系列的称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象不可用。 哪些对象可以作为GC Roots对象?    虚拟机栈

BUFFER CACHE和SHARED POOL原理

廉价感情. 提交于 2019-12-21 22:19:25
http://blog.csdn.net/wanghai__/article/details/4881492 Buffer Cache LRU与Dirty List 在Buffer Cache中, Oracle 通过几个链表进行内存管理。 LRU list用于维护内存中的Buffer,按照LRU 算法 进行管理。 数据库 初始化时,所有的Buffer都被Hash到LRU list上管理。当需要从数据文件上读取数据时,首先要在LRU List上寻找Free的Buffer,然后读取数据到Buffer Cache中;当数据被修改之后,状态变为Dirty,就可以被移动至Dirty List,Dirty List上的都是候选的可以被DBWR写出到数据文件的Buffer,一个Buffer要么在LRU List上,要么在Dirty List上存在,不能同时存在于多个list。 Buffer Cache 的原理及使用 : ①当一个Server进程需要读数据到Buffer Cache中时,首先必须判断该数据在Buffer中是否存在,如果存在且可用,则获取该数据,根据LRU算法在LRU List上移动该Block;如果Buffer中不存在数据,则需要从数据文件上读取。 ②在读取数据之前,Server进程需要扫描LRU List寻找Free的Buffer