.NET 4.5已然到来,预览了解了下Large Object Heap在.NET 4.5中的效能改进。借此和大家来探讨下。本文不讨论Loder Heap,SOH(samll object heap),LOH(large object heap),JIT Heap,Process Heap关系和区别。也不会着重讨论GC,单论Large Object Heap在.NET 4.5中的改进。

在比较频繁使用Large Object(对象不小于85,000bytes)系统中,经常容易抛出Out-of-memory的exception。可能我们的物理内存已经不足够使用,然而有时在物理内存足够的情况下,也还是会抛出这种错误,这实际上就是Memory free list中的LOH fragmentation引起的。

CLR托管对象中有两种不同的内存分配方式,一个就是SOH,另一个就是LOH。实际上我们经常说的Manage Heap其实就是GC heap,可以这样认为GC heap=SOH+LOH。当托管对象声明时,需要在当前AppDomain内存中开辟一块连续的内存空间,SOH与LOH分配方式不同的时,SOH在当前内存空间不够或者找不到合适连续内存块(连续空闲内存空间)会自压缩空间,把不连续的空闲空间整合在一起以满足分配需要,这点类似磁盘的碎片整理。

LOH不会进行这种操作。当前内存指针找不到合适的内存空间时,就是抛出Out-of-memory的exception。LOH对象的生存周期是根据“代次” (generation)来确定的,事实上是最高代龄(Genaration 2),对象越大,对其进行垃圾回收的成本也就越大,基于此考虑,CLR对LOH对象采取这种特殊的管理方式。当前内存不足时,LOH不会进行压缩以获取足够的内存空间,这也是产生fragmentation的根本原因。但是有点特殊的是当连续空间的多个大对象已被标记为可回收时候,CLR会检测并合并这些可用空间,形成更大的连续可用的内存空间,当分配新的Large Obj时,是开辟新的内存空间,还是进行查找合并可用空间呢,CLR会根据实际环境运行情况进行评估,以求在效能和应用上达到平衡。

在.NET 4.5中改进了两点,第一是改进free list的轮检管理机制,从而达到对memory fragments空间的有效利用。当当前内存指针空间不可用的时候,memory allocator会再次遍历memory fragments,查看时候有满足容量的memory fragments,或者合并相邻的可用memory fragments以满足当前对象内存需要。第二在GC Server模式下,CLR会在分配大容量内存和性能之前寻找一个平衡,因为Large Object本身就在第2代,CLR会增加其分配阈值,会获取一个非常大的回收内存。这个是SOH之前的平衡做法有些类似。

多数大对象在本质是相同的,所以我们可以采用object pooling来避免LOH的频繁操作,以达到提高效能的目的。

Large Object Heap内存碎片在.NET 4.5中的改进的更多相关文章

  1. The Dangers of the Large Object Heap(转载,LOH内存碎片情景重现)

    原文地址:https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ You'd h ...

  2. 关于LOH(Large Object Heap)及内存泄漏

    关于LOH(Large Object Heap)的. .NET CLR中对于大于85000字节的内存既不像引用类型那样分配到普通堆上,也不像值类型那样分配到栈上,而是分配到了一个特殊的称为LOH的内部 ...

  3. ionic android - Unable to start the daemon process. Could not reserve enough space for 2097152KB object heap

    Unzipping C:\Users\app\.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew\gradle-4.1-all ...

  4. Android Studio: Failed to sync Gradle project 'xxx' Error:Unable to start the daemon process: could not reserve enough space for object heap.

    创建项目的时候报错: Failed to sync Gradle project 'xxx' Error:Unable to start the daemon process: could not r ...

  5. Tomcat启动报错 Could not reserve enough space for object heap

    报错信息: Error occurred during initialization of VM Could not reserve enough space for object heap Coul ...

  6. 启动tomcat报错 Could not reserve enough space for object heap的解决办法

    问题:打开eclips启动tomcat发现报出Could not reserve enough space for object heap错误. 解决办法:1.首先检查tomcat是否能正常启动.re ...

  7. Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

    ionic build Android后的报错问题 ionic 升级了splashscreen和statusbar的插件后,执行ionic build android会一直报打包错误.原因是过低的An ...

  8. Error occurred during initialization of VM Could not reserve enough space for object heap

    Error occurred during initialization of VM Could not reserve enough space for object heap Java虚拟机(JV ...

  9. fisheye Error occurred during initialization of VM Could not reserve enough space for object heap 问题解决!

    参考文章:https://answers.atlassian.com/questions/9397/not-enough-heap-space-to-run-fisheye fisheye下载好了之后 ...

随机推荐

  1. ftp命令和scp命令

    ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器  格式:ftp [hostname| ip-ad ...

  2. 山寨小小军团开发笔记 之 GamePool

    很多时候我们对于物体(比如弓箭)大量的生成与销毁,这个时候可以把弓箭放在内存池中进行管理,加快体验.自己Copy了一个简易版的. 一.代码 GameObjectPoolManager.cs using ...

  3. mysql date数据类型异常原因0000-00

    1.数据库字段: `dri_lic_first_time` date DEFAULT NULL COMMENT '驾驶证初次领证日期', 2.异常信息 org.springframework.dao. ...

  4. 利用MariaDB Galera Cluster实现mariadb的多主复制

    一.MariaDB Galera Cluster概要: .简述: MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的 ...

  5. HDU4010 Query on The Trees(LCT)

    人生的第一道动态树,为了弄懂它的大致原理,需要具备一些前置技能,如Splay树,树链剖分的一些概念.在这里写下一些看各种论文时候的心得,下面的代码是拷贝的CLJ的模板,别人写的模板比较可靠也方便自己学 ...

  6. java基础知识回顾之抽象类和接口的区别

    /* 抽象类和接口的异同点: 相同点: 都是不断向上抽取而来的. 不同点: 1,抽象类需要被继承,而且只能单继承. 接口需要被实现,而且可以多实现. 2,抽象类中可以定义抽象方法和非抽象方法,子类继承 ...

  7. 安装mysql之后,存入中文出现乱码 02

    现在出现这个问题,将编码字符串改成utf8 之后 数据表 还是不能存储中文. 看如下两张图,应该会有启发: 这下应该明白了吧.

  8. Linux客户/服务器程序设计范式2——并发服务器(进程池)

    引言 让服务器在启动阶段调用fork创建一个子进程池,通过子进程来处理客户端请求.子进程与父进程之间使用socketpair进行通信(为了方便使用sendmsg与recvmsg,如果使用匿名管道,则无 ...

  9. Inlinehook PspCreateProcess

    InineHook通过修改函数指令实现,此次以内核层的PspCreateProcess()为例. 本来是想写NtCreateProcess()的Inlinehook,但是想到PCHunter对于SSD ...

  10. html + css + js注释规范

    添加注释到代码中,是一个很好的习惯,而且极大的提高了代码的可读性 1.HTML <!--commentContent--> 2.CSS //commentContent /*comment ...