生存期垃圾回收器

目前有很多种类型的垃圾回收器.微软实现了一种生存期垃圾回收器(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. hibernate常见错误

    1.Hibernate: Could not synchronize database state with session 1.主键不是自动生成的,然后自己没手动设置.  2.插入的实体字段跟数据库 ...

  2. 【小错误】起归档是遇到ORA-00265: instance recovery required, cannot set ARCHIVELOG mode

    今天在起归档时遇到ORA-00265: instance recovery required, cannot set ARCHIVELOG mode的错误 从错误我们能够看到是由于datafile,c ...

  3. 数据库中GUID的生成

    GUID, 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算法产生 ...

  4. [Oracle] 中的Temporary tablespace的作用

    临时表空间主要用途是在数据库进行排序运算[如创建索引.order by及group by.distinct.union/intersect/minus/.sort-merge及join.analyze ...

  5. No.004 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...

  6. 完成《Java编程入门》初稿

    Java编程入门 现在的运维工程师不但要懂得集合网络.系统管理而且要和开发人员一起调试系统,社会上也需要"复合性"的运维人员,所以需要做运维的也要懂一些开发,知道软件系统接口的调试 ...

  7. VS2013连接不上TFS,TF31002记录

    之前vs2013连接好好的,昨天就发现不行,类似如下错误 可能原因及解决办法: 1:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG 下的 Ma ...

  8. 关于union的那些事儿

    自从当年明月的<明朝的那些事儿>爆红之后,以***那些事儿命名的文章便层出不穷.个人认为,这样的命名通俗但具有吸引力,容易接地气.哈哈,所以我也写了几篇以<***那些事儿>的文 ...

  9. 【缓存】利用Cache防止同一帐号重复登录

    需求概要 对于B/S应用系统中客户经常会提出同一帐号不能重复登录的需求,就是说,用某一帐号登录系统后,在系统不超时的情况下,任何人都不能再用目前已登录的帐号登录系统.包括我目前的项目中同样有这一需求. ...

  10. Oracle定时器执行多线程

    what里面加下面代码强制执行多线程   begin  execute immediate 'alter session force parallel dml parallel 16';  pkg_s ...