Large Object Heap内存碎片在.NET 4.5中的改进
.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中的改进的更多相关文章
- 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 ...
- 关于LOH(Large Object Heap)及内存泄漏
关于LOH(Large Object Heap)的. .NET CLR中对于大于85000字节的内存既不像引用类型那样分配到普通堆上,也不像值类型那样分配到栈上,而是分配到了一个特殊的称为LOH的内部 ...
- 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 ...
- 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 ...
- Tomcat启动报错 Could not reserve enough space for object heap
报错信息: Error occurred during initialization of VM Could not reserve enough space for object heap Coul ...
- 启动tomcat报错 Could not reserve enough space for object heap的解决办法
问题:打开eclips启动tomcat发现报出Could not reserve enough space for object heap错误. 解决办法:1.首先检查tomcat是否能正常启动.re ...
- 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 ...
- 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 ...
- 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下载好了之后 ...
随机推荐
- mvc从xheditor编辑器中获取内容时存在潜在危险
xmfdsh在使用xheditor提交要发布的文章等内容的时候出现了如下的错误: 从客户端(Content="<p style="text-align...")中检 ...
- Spring.net Could not load type from string value
最近有点懒了啊,都没有按时上来博客园更新下,个人觉得遇到难题的时候在这里留下脚印也亦造福他人,进来 晓镜水月 被项目围的团团转,asp.net MVC项目来的,但是我还是不务正业啊,在弄网络爬虫,这个 ...
- POJ 2531 Network Saboteur (枚举+剪枝)
题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大. 目前我所知道的有四种做法: 方法一:状态压缩 #include <iostream> #inc ...
- 虚拟专用网络VPN
寒假回到家里需要下载论文,怎样才能访问学校图书馆的数据库呢?解决方法是学校图书馆在内网中架设一台VPN服务器,VPN服务器有两块网卡,一块连接内网,一块连接公网.然后就可以通过互联网找到VPN服务器, ...
- HDU 4169 树形DP
Wealthy Family Problem Description While studying the history of royal families, you want to know ho ...
- Struts2 Convention插件的使用(4)使用@Action注解返回json数据
package com.hyy.action; import java.util.HashMap; import java.util.Map; import org.apache.struts2.co ...
- hdu 4223
暴力: Problem : ( Dynamic Programming? ) Judge Status : Accepted RunId : Language : C++ Author : yudun ...
- 安卓app缓存设置
无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户. Android的apk可以说是作为小型应用,其中99%的应用并不是需要实时更新的,而且诟病于蜗牛 ...
- Eclipse项目的导入跟导出
1.导入项目 当下载了包含Eclipse 项目的源代码文件后,我们可以把它导入到当前的Eclipse 工作区然后编辑和查看.点击菜单File > Import,然后在弹出的Import 对话框中 ...
- ks全自动安装centos
1. 全新安装centos,选择好所需定制包 2. 完成安装后会在root下面生成一个install.log(rpm包列表)anaconda-ks.cfg(下文的ks.cfg基于此文件修改) 3. 将 ...