生存期垃圾回收器

目前有很多种类型的垃圾回收器.微软实现了一种生存期垃圾回收器(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. JAVA集合学习

    JAVA中有几种常用的集合类.分别是List,Set,Map等 提示:Eclipse中自动导入包的快捷键  Ctrl+Shift+O 一.List类 父接口:该类是Collection集合接口的子接口 ...

  2. python学习笔记(SMTP邮件发送:带附件)

    博主有段时间没有更新博客了 先整理一个之前整理过的SMTP邮件发送,这次是带附件的功能 #!/usr/bin/env python # -*- coding: utf_8 -*- from email ...

  3. Java程序员面试宝典1 ---Java基础部分(该博文为原创,转载请注明出处)

    (该博文为原创,转载请注明出处   http://www.cnblogs.com/luyijoy/  by白手伊凡) 1.    基本概念 1)         Java为解释性语言,运行过程:程序源 ...

  4. Flex4/AS3.0自定义VideoPlayer组件皮肤,实现Flash视频播放器

    要求 必备知识 本文要求基本了解 Adobe Flex编程知识. 开发环境 Flash Builder4/Flash Player11 演示地址 演示地址 资料下载   Adobe Flash Pla ...

  5. oracle通过DBlink连接mysql(MariaDB)

    1.安装先装 mysql-connector-odbc(或 mariadb-connector-odbc )和unixODBChttps://downloads.mariadb.org/mariadb ...

  6. c语言描述简单的线性表,获取元素,删除元素,

    //定义线性表 #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; //这是数组的长度, ...

  7. PL/SQL 导入excel表格到oracle数据表

    通过使用PL/SQL 批量查询取数时,将excel中的每一列数据复制黏贴进新建的中间表,黏贴时会有贴歪的情况,也就是某些列会从第二第三行开始插入整列,导致数据乱掉,然后好像又不支持批量删除整列数据,所 ...

  8. 使用CORS:跨域两三事

    本文为译文. 简介 APIS是可以将富网页应用串连在一起的线程.但是这个应用难以转给浏览器,跨域请求技术的选择被限制了,类似JSONP(由于安全考虑,使用会被限制),或者配置代理(设置和维护都比较头痛 ...

  9. 法线贴图——Normal Mapping

    对于不曾学过.用过法线贴图的人来说,提到法线贴图,经常会提到的问题是什么是法线贴图?法线贴图用于解决什么问题?法线贴图的原理是什么?本文将就这三个问题阐述本人的一些见解,各位不喜勿喷!!! 谈到法线贴 ...

  10. C# 多线程---------<一>

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...