.NET内存管理必备知识

简介: .NET内存管理必备知识

小型对象如何处理

小型对象是被分配在小型对象堆SOH上的。SOH有3代,分别是:第0代,第1代,第2代。对象根据寿命向上移动。将新对象放在Gen 0上。当第0代充满时,.NET垃圾收集器会处理不需要的对象,并将其它内容移至第1代上,如果第1代充满了那么垃圾回收会再次运行处理不需要的对象,并将其它内容移至第2代上。那么当第2代充满时会发生垃圾回收完全运行。将清除不需要的第2代对象,并将第1代对象移动到第2代上,然后将第0代对象移动到第1代上,最后清除所有未引用内容。每次运行垃圾回收后会压缩受影响的堆,将仍然在使用的内存放置在一起。这种方法可以确保高效运行,并且耗时的压缩过程只在必要时发生。


Tip:如果在第2代中看到大量内存,表明内存被保留了很长时间,可能存在内存问题,我们需要使用内存分析工具去分析它。


较大对象如何处理

大于85KB的对象被分配在大对象堆LOH。由于复制大块内存的开销,不会进行被压缩。发生完整垃圾回收时未使用的对象的地址范围将记录在可用空间分配表中。当分配了新对象后会在此可用空间表中检查足以容纳这个对象的地址范围。如果存在就将对象分配到那里,如果不存在就将对象分配到下一个可用空间中。由于对象不可能知道地址范围的确切大小,所以对象与对象之间总是留着小块内存这样就出现了碎片。那么如果这些块小于85KB就根本没有可重用性。所以随着分配需求的增加,即使碎片空间可用也会保留新段。当需要分配大对象时.NET会倾向将对象添加到末尾,而不是运行第二代垃圾回收,这样做虽然对性能有好处,但是会导致内存碎片。

垃圾收集器可以在不同的模式下运行以优化性能

.NET通过为垃圾回收提供多种模式来解决权衡性能与堆效率的问题。模式如下:


  1. 工作站模式:提供了最大响应速减少由于GC造成的暂停。可以作为并发和非并发运行,默认为并发,为垃圾回收使用单独线程,因此应用程序可以垃圾回收时继续运行;
  2. 服务器模式:服务器环境提供最大吞吐、可伸缩性和性能。服务器模式下段大小和阈值比工作站模式要大很多,反映了对服务器更高的要求。它在多个线程上并行运行垃圾回收,为每个处理器分配一个独立的SOH和LOH防止线程相互干扰。


.NET框架提供了一种交叉引用机制,对象之间仍然可以在堆之间相互引用。但由于应用程序响应能力不是服务器模式的直接目标,所以在垃圾回收期间所有应用程序线程都会被挂起。


引用不足会在性能和内存效率之间折衷

弱对象引用可以保留对象,同时在垃圾回收需要时可以收集对象。是代码性能和内存效率之间的折衷。创建对象需要占用CPU时间,但保持加载状态需要占用内存。


对象固定可以在托管和非托管代码之间传递引用

.NET使用GCHandle结构来跟踪堆对象。GCHandle可用于在托管域和非托管域之间传递对象引用,.NET维护一个GCHandles表以实现此目的。CHandle有四种类型,其中固定类型用于将对象固定在内存中特定地址。但是对象固定的主要问题是可能导致SOH碎片化。如果将对象固定在垃圾回收期间,那么该对象将无法重定位。使用固定的方式会降低压缩效率并在堆中留下间隙。避免这种情况的最佳策略是在短时间内锁定然后释放。


目录
相关文章
|
算法 Java .NET
艾伟_转载:.NET内存管理、垃圾回收
1. Stack和Heap   每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况。值类型变量(函数的参数、局部变量 等非成员变量)都分配在stack中,引用类型的对象分配在heap中,在stack中保存heap对象的引用指针。
1006 0
|
Java .NET
一起谈.NET技术,关于CLR内存管理一些深层次的讨论 [下篇]
  《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域方式);以及基于进程范围内的字符串驻留。
1068 0
|
.NET
一起谈.NET技术,关于CLR内存管理一些深层次的讨论 [上篇]
  半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此,今天按照PPT的内容写了一篇文章。
794 0
|
Java .NET C#
.NET面试题解析(06)-GC与内存管理
转自:http://www.cnblogs.com/anding/p/5260319.html   常见面试题目: 1. 简述一下一个引用对象的生命周期? 2. 创建下面对象实例,需要申请多少内存空间? public class User { public int Age { get; ...
2013 0
|
Java C#
你知道.NET框架下的自动内存管理吗?
  C#使用的自动内存管理,使用开发者从繁重的手工分配、释放内存的操作解放出来。内存的自动管理是由垃圾回收器来执行。一个对象使用内存的生命周期是这样的:  当对象被创建时,它便分配了一定的内存,当构造器中的代码开始运行时,这个对象就“活”了。
731 0
|
3天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
48 0
|
3天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
23 0