生存期垃圾回收器

目前有很多种类型的垃圾回收器.微软实现了一种生存期垃圾回收器(Generation Garbage Collector).

生存期垃圾回收器将内存分为很多托管堆,每一个托管堆对应一个生存期等级。

垃圾回收器目前有三个生存期等级,这里我们称作代,0代,1代,2代,GC中0代是最年轻的对象,2代对象存活的时间最长,GC按代回收垃圾出于性能考虑,通常对象会在0代被回收.

在应用程序初始化之前,所有等级的托管堆都是空的,当对象初始化的时候,他们会按照初始化的先后顺序被放入0代的托管堆中(有例外)。在托管堆中对象是连续存放的,垃圾回收器中保存了一个指针指向托管堆中最后一个对象之后的内存空间

当0代托管堆超过了256K,垃圾回收器检查托管堆中的所有对象,看是否有对象可以回收.

当开始回收时,垃圾回收器找出被继续引用的对象,将这些对象转1代托管堆中,并将0代托管堆的指针移动到开始的位置清除所有的对象,并压缩1代托管堆以保证所有对象之间没有空隙

   1代托管堆满了之后,或者1代托管堆没有被垃圾回收器回收,会转移到2代的托管堆

当对象被转移到2代的时候,2代不会被垃圾回收器进行压缩,碎片整理

大对象堆和小对象堆

垃圾回收器根据所占空间大小划分大对象堆和小对象堆,如果一个对象的大小超过85000byte,就认为是一个大对象,当一个对象申请内存大小达到这个阀值,它就会被分配到大对象堆上.

从代的角度看,大对象堆属于2代堆,所以2代堆也叫大对象堆(LOH,large object head),小对象堆(SOH,small object heap)属于0代和1代;前面我们说过2代堆被回收后剩下的对象不会被进行碎片整理,也就是说大堆相对不会被压缩和整理

1,小对象堆释放后,剩下的对象会被碎片整理,压缩合并

2,大对象堆释放后,无效内存留下的空间如果相邻就会被合并,如果不相邻就会单独空在那里;

3,当分配一个大对象时,运行时会优先尝试在LOH的尾部进行分配,如果尾部空间不足,就会尝试向操作系统请求更多的内存空间,只有在这一步也失败时才会重新搜索之前无效对象留下的内存空隙.

         

下面是大对象堆内存分配问题:

          

上面的图:

1,LOH中已经存在一个大小为85K的对象和一个大小为16M对象,当需要分配另外一个大小为85K的对象,会在尾部空间;

2,此时发生了一次垃圾回收,大小为16M的对象被回收,其占用的空间为未使用状态,但运行时并没有对LOH进行压缩。

3,此时再分配一个大小为16.1M的对象时,分尝试在LOH尾部分配.但尾部空间不足,所以运行时向操纵系统请求额外的内存,并将对象分配在尾部.

4,此时如果再需要分配一个大小为85K的对象,则优先使用尾部的空间.

OutOfMemoryException内存溢出问题:

当我们每次往后面申请的内存都比前面的大的时候

最后向系统申请内存申请不到,前面也没有任何一块连续区域满足要求时,就会出现内存溢出的问题

    

大对象什么时候回收:

      1,申请的空间超过0代内存大小或者大对象堆的阀值,多数的托管堆垃圾回收在这种情况发生

2,在程序代码中调用GC.Collect方法时;如果在调用GC.Collect方法是传入GC.MAXGeneration参数时,会执行所有代对象的垃圾回收,包括大对象堆的垃圾回收

3,操作系统内存不足时,当应用程序收到操作系统发出的高内存通知时,

4,如果垃圾回收算法认为做二代回收是有收效时会触发二代垃圾回收

解决大对象堆溢出问题

      1.将比较大的对象分割成较小的对象,使每个小对象大小小于85, 000字节,从而不再分配在LOH上;

2.尽量“重用”少量的大对象,而不是分配很多大对象;

3.当大对象回收比较慢的时候,可以选择做强制垃圾回收,但频繁回收大对象会损耗系统性能

.net 内存分配及垃圾回收总结的更多相关文章

  1. JVM内存分配与垃圾回收机制管理

    项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...

  2. CLR、内存分配和垃圾回收

    一.CLR CLR:即公共语言运行时(Common Language Runtime),是中间语言(IL)的运行时环境,负责将编译生成的MSIL编译成计算机可以识别的机器码,负责资源管理(内存分配和垃 ...

  3. 浅谈JVM内存分配与垃圾回收

    大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...

  4. JVM的内存分配与垃圾回收策略

    自动内存管理机制主要解决了两个问题:给对象分配内存以及回收分配给对象的内存. >>垃圾回收的区域 前面的笔记中整理过虚拟机运行数据区,再看一下这个区域: 注意在这个Runtime Data ...

  5. java内存分配与垃圾回收

    JVM的内存分配主要基于两种,堆和栈. 我们来看一下java程序运行时候的内存分配策略: 1):静态存储区(方法区): 2):栈区: 3):堆区: 1):主要存放静态数据,全局static数据和常量. ...

  6. Java 内存分配及垃圾回收机制初探

    一.运行时内存分配 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则 ...

  7. JVM 内存分配和垃圾回收(GC)机制

    一  判断对象是否存活 垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“活着”,哪些已经"死去”,即不能再被任何途径使用的对象. 1.1 引用计数法 (Reference ...

  8. JVM内存分配和垃圾回收以及性能调优

    JVM内存分配策略 一:堆中优先分配Eden 大多数情况下,对象都在新生代的Eden区中分配内存.而新生代会频繁进行垃圾回收. 二:大对象直接进入老年代 需要大量连续空间的对象,如:长字符串.数组等, ...

  9. JVM性能调优(3) —— 内存分配和垃圾回收调优

    前序文章: JVM性能调优(1) -- JVM内存模型和类加载运行机制 JVM性能调优(2) -- 垃圾回收器和回收策略 一.内存调优的目标 新生代的垃圾回收是比较简单的,Eden区满了无法分配新对象 ...

随机推荐

  1. Laxcus大数据管理系统2.0(14)- 后记

    后记 Laxcus最早源于一个失败的搜索引擎项目,项目最后虽然终止了,但是项目中的部分技术,包括FIXP协议.Diffuse/Converge算法.以及很多新的数据处理理念却得以保留下来,这些成为后来 ...

  2. JMeter的定时器

    JMeter的十种定时器 先明确一些概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后,不管这个定时器的位置放在sampler之后,还是之前.2)定时器是有作用域的:当执行一个sa ...

  3. Ubuntu上部署Ghost博客

    所有文章搬运自我的个人主页:sheilasun.me 刚刚成功把自己的ghost博客部署到Linode VPS上了,在这里回顾并顺便整理一下从购买域名到部署代码到服务器的整个过程. 购买域名 万网或者 ...

  4. 【caffe-windows】 caffe-master 之 mnist 超详细

    本教程尽量详细,大多步骤都有图,如果运行出错,请先对照自己的文件是否和图上的一样,包括标点啊,空格啊,斜杠,反斜杠啊之类的小细节. 第一步:   官网下载mnist数据 http://yann.lec ...

  5. Orchard官方文档翻译(七) 导航与菜单

    原文地址:http://docs.orchardproject.net/Documentation/Navigation-and-menus 想要查看文档目录请用力点击这里 最近想要学习了解orcha ...

  6. 博客中 Flex4/Flash mp3音乐播放器实例 含演示地址

    要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...

  7. FastDFS的安装配置

    一:实验描述: fastdfs 介绍 FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别 ...

  8. 安装Oracle软件

    1.安装linux操作系统和VMware Tools 2.创建组和用户,以root用户运行以下命令: groupadd -g 1000 oinstall groupadd -g 1001 dba us ...

  9. 用C#访问Dynamic AX的WebService.

    第 1 步:创建 C# WinForm 应用程序 针对本演练,您将创建访问报表服务器 Web 服务的简单控制台应用程序.本演练假定您是在 Visual Studio 环境中进行开发的.测试范例基于VS ...

  10. Ax Lookup Form

    Reference: Class\sysLookupTable 1. 用临时表构造Lookup下拉结果,sysLookupTable有一个parmTmpBuffer方法,表明传入展示的结果集是临时表 ...