.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. c# 简单文件流读写CSV文件

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

  2. SQLite中的PRAGMA语句攻略

    原文地址:http://iihero.iteye.com/blog/1189633 PRAGMA语句是SQLITE数据的SQL扩展,是它独有的特性,主要用于修改SQLITE库或者内数据查询的操作.它采 ...

  3. topcoder 642

    A:直接拆开字符串写就好了. 今天的题目比较容易一些: B:题目大意: 求最少的翻转次数,每次翻转i是对应 y%i==0都会翻转. 球所有翻转为off状态的最小次数: 从最小idx开始,依次做就好了, ...

  4. MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)

    MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)  OneAPM蓝海讯通7月3日 发布 推荐 4 推荐 收藏 14 收藏,1.1k 浏览 MariaDB 作为 ...

  5. sql Server2005 master损坏处理

    一.准备条件 a)         假设Master 数据库Hung:关闭SQL Server 服务(关闭MSSQLSERVER,SQL Server Agent其他的没有影响),然后剪切C:/Pro ...

  6. HDU 4576 Robot(概率dp)

    题目 /*********************复制来的大致题意********************** 有N个数字,M个操作, 区间L, R. 然后问经过M个操作后落在[L, R]的概率. * ...

  7. facebook design question 总结

    http://blog.csdn.net/sigh1988/article/details/9790337 这里原帖地址: http://www.mitbbs.com/article_t/JobHun ...

  8. python编写规范

    一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准头部... 2.2 导入(i ...

  9. lintcode :First bad version 第一个错误的代码版本

    题目 第一个错误的代码版本 代码库的版本号是从 1 到 n 的整数.某一天,有人提交了错误版本的代码,因此造成自身及之后版本的代码在单元测试中均出错.请找出第一个错误的版本号. 你可以通过 isBad ...

  10. hive-学习笔记

    1.hive模糊搜索表  show tables like '*name*'; 2.查看表结构信息  desc formatted table_name;  desc table_name; 3.查看 ...