Net内存管理五大基础

目录
  • 1.小对象怎么处理的?
  • 2.较大的对象会怎样?
  • 3.垃圾收集器可以在不同的模式下运行以优化性能
  • 4.引用不足会在性能和内存效率之间折衷
  • 5.对象固定可以创建在托管和非托管代码之间传递的引用

1.小对象怎么处理的?

小型.NET对象被分配到小型对象堆(SOH)上。其中有3种:第0代,第1代和第2代。对象根据其寿命向上移动。

将新对象放在Gen 0上。当Gen 0充满时,.NET垃圾收集器(GC)运行,处理不再需要的对象,并将其他所有内容移至Gen1。如果Gen 1充满,则GC再次运行,也可以将Gen 1中的对象移动到Gen 2中。

Gen 2变满时,将发生GC完全运行。这将清除不需要的Gen 2对象,将Gen 1对象移至Gen 2,然后将Gen 0对象移至Gen 1,最后清除所有未引用的内容。每次运行GC之后,都会压缩受影响的堆,以将仍在使用的内存保持在一起。

这种代代相传的方法可确保事情高效运行-耗时的压缩过程仅在绝对必要时才会发生。

注意:如果您在Gen 2中看到大量的内存,则表明内存已被保留很长时间,并且可能存在内存问题。这是内存分析工具可以派上用场的地方。

2.较大的对象会怎样?

大于85 KB的对象被分配到大对象堆(LOH)。由于复制大块内存的开销,它们没有被压缩。当发生完整的GC时,未使用的LOH对象的地址范围将记录在可用空间分配表中。

分配新对象后,将在此可用空间表中检查足以容纳该对象的地址范围。如果存在,则将对象分配到那里,如果不存在,则将对象分配到下一个可用空间。

由于对象不太可能是空地址范围的确切大小,因此对象之间几乎总是会留有小块内存,从而导致碎片。如果这些块小于85 KB,则根本没有重用的可能性。因此,随着分配需求的增加,即使碎片空间仍然可用,也会保留新的段。

此外,当需要分配大对象时,.NET还是倾向于将对象附加到末尾,而不是运行昂贵的Gen 2 GC。这对性能有好处,但是是导致内存碎片的重要原因

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

.NET通过为GC提供多种模式来解决性能与堆效率之间的权衡问题。

工作站模式为用户提供了最大的响应速度,并减少了由于GC造成的暂停。它可以作为“并发”或“非并发”运行,指的是运行GC的线程。默认值为并发,它为GC使用单独的线程,因此应用程序可以在GC运行时继续执行。

服务器模式可为服务器环境提供最大的吞吐量,可伸缩性和性能。在服务器模式下,段大小和生成阈值通常比工作站模式大得多,这反映了对服务器的更高要求。

服务器模式在多个线程上并行运行垃圾回收,为每个逻辑处理器分配一个单独的SOH和LOH,以防止线程相互干扰。

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

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

弱对象引用了GC根的替代来源,使您可以保留对象,同时在GC需要时可以收集对象。它们是代码性能和内存效率之间的折衷。创建对象需要占用CPU时间,但保持加载状态需要占用内存。

弱引用特别适用于大型数据结构。例如,假设您有一个允许用户浏览大型数据结构的应用程序,他们可能会返回其中的一些数据。您可以将任何强引用转换为他们浏览的结构为弱引用。如果用户返回到这些结构,则可以使用它们,但如果没有,GC可以根据需要回收内存。

5.对象固定可以创建在托管和非托管代码之间传递的引用

.NET使用一种称为GCHandle的结构来跟踪堆对象。GCHandle可用于在托管域和非托管域之间传递对象引用,.NET维护一个GCHandles表以实现此目的。GCHandle有四种类型,包括固定的,用于将对象固定在内存中的特定地址。

对象固定的主要问题是它可能导致SOH碎片化。如果将对象固定在GC期间,则根据定义,该对象无法重定位。根据您使用固定的方式,它会降低压缩的效率,在堆中留下间隙。避免这种情况的最佳策略是在很短的时间内锁定,然后释放。

到此这篇关于Net内存管理五大基础的文章就介绍到这了,更多相关Net内存管理五大基础内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .Net程序内存异常的原因及解决

    目录 一.概要 二.场景 三.思路 (1)分析 Part1,分析日志堆积原因 Part2,查找内存泄漏的根本原因 (2)工具 Part3,总结 Part4,彩蛋 一.概要 大概在今年三月份的时候突然被紧急调到另外一个项目组解决线上内存异常问题.经过两周的玩命奋战终于解决了这个问题这里把心路历程及思路分享给大家.希望可以帮助到各位或现在正遇到这样事情的小伙伴提供一些思路. 二.场景 当部门老大找到我的时候,给我描述了这样一段话. "目前服务出现了提交内存异常的问题,目前分析出来可能是日志组件有大量

  • 一篇文章教你如何排查.NET内存泄漏

    目录 前言 检查托管内存使用 生成dump文件 分析 core dump 总结 前言 内存泄漏通常表示:一个应用程序的某些对象在完成它的的生命周期后,由于它被其他对象意外引用,导致后续gc无法对它进行回收,长此以往就会导致程序性能的下降以及潜在的 OutOfMemoryException. 这篇我们通过一个内存泄漏工具对 .NET Core 程序进行内存泄漏分析,如果程序是跑在windows上,那直接可以使用 Visual Studio 进行诊断. 检查托管内存使用 在开始分析内存泄漏之前,你一

  • .Net Core内存回收模式及性能测试对比分析

    .NET Core 两种GC模式: Server GC / Workstation GC Server GC : 主要应用于多处理器系统,并且作为ASP.NET Core宿主的默认配置.它会为每个处理器都创建一个GC Heap,并且会并行执行回收操作.该模式的GC可以最大化吞吐量和较好的收缩性.这种模式的特点是初始分配的内存较大,并且尽可能不回收内存,进行回收用时会很耗时,并进行内存碎片整理工作.用一句简单的话说,这个就是贪婪模式,通过尽可能多的获得内存和少回收来得到更好的性能.结果就是高内存使

  • 分析Netty直接内存原理及应用

    一.通常的内存模型概述 一般地,系统为了保证系统本身的安全性和健壮性,会将内存从逻辑上隔离成内核区域和用户区域,这很容易理解.因为用户行为不可控性太强,暴露得太多,就容易导致各种神奇的用法,超出系统的控制范围.当然,有的语言是支持直接控制内存的,比如C, 你可以用一个指针,访问内存中的几乎任意位置的数据(除了一些硬件地址).而像汇编,则可以访问任意地址.而这些底层的语言,已经离我们越来越远了,它基本上和普通程序员关系不大了. 用户很多时候的编程控制,都是在用户区域进行的,比如我做一些加减乘除,如

  • 基于.NET BitmapImage 内存释放问题的解决方法详解

    网上查到的代码,多数的写法使用MemoryStream来实现: 复制代码 代码如下: new Thread(new ThreadStart(() => {    var bitmap = new BitmapImage();    bitmap.BeginInit(); using (var stream = new MemoryStream(File.ReadAllBytes(...))) {        bitmap.StreamSource = stream;        bitmap

  • asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)

    复制代码 代码如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; usi

  • asp.net动态产生checkbox(数据源为DB或内存集合)

    之前在网上看了很多,其实有一些也是大同小异,本人在此小编一下大致解决方案摒弃微软提供的CheckBoxList 需求: 1动态产生一组checkbox(数据源为DB或内存集合) 2post提交时后台能及时获取 3提交后刷新页面checkbox保持原先选中或取消选中状态 4避免产生大量的viewstate 方案:使用repeater+input(checkbox)+input(hidden) html代码 复制代码 代码如下: <asp:Repeater runat="server"

  • asp.net中C#实现手动回收内存的方法

    C#有自动回收内存的机制,但是有时自动回收有一定滞后,需要在变量使用后迅速回收,节约内存,这里介绍一个最简单的方法. 1.先对对象赋值 null; 2.使用System.GC.Collect() 复制代码 代码如下: class Program {          static void Main(string[] args)          {              long lenth = 1024 * 1024 * 128;                GetCost("程序启动

  • Net内存管理五大基础

    目录 1.小对象怎么处理的? 2.较大的对象会怎样? 3.垃圾收集器可以在不同的模式下运行以优化性能 4.引用不足会在性能和内存效率之间折衷 5.对象固定可以创建在托管和非托管代码之间传递的引用 1.小对象怎么处理的? 小型.NET对象被分配到小型对象堆(SOH)上.其中有3种:第0代,第1代和第2代.对象根据其寿命向上移动. 将新对象放在Gen 0上.当Gen 0充满时,.NET垃圾收集器(GC)运行,处理不再需要的对象,并将其他所有内容移至Gen1.如果Gen 1充满,则GC再次运行,也可以

  • FreeRTOS实时操作系统的内存管理分析

    目录 1.heap_1.c 功能简介: 2.heap_2.c 功能简介: 3.heap_3.c 功能简介: 4.heap_4.c 功能简介: 5.heap_5.c(V8.1.0新增) 前言 本文介绍内存管理的基础知识,详细源码分析见< FreeRTOS内存管理示例分析> FreeRTOS提供了几个内存堆管理方案,有复杂的也有简单的.其中最简单的管理策略也能满足很多应用的要求,比如对安全要求高的应用,这些应用根本不允许动态内存分配的. FreeRTOS也允许你自己实现内存堆管理,甚至允许你同时使

  • C/C++内存管理基础与面试

    目录 1.C/C++内存分布 2.C语言中动态内存管理方式 3.C++中动态内存管理方式 3.1 对于内置类型 3.2 对于自定义类型 3.3 new的底层原理 4. 常见的面试题 1.C/C++内存分布 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的. 内存映射段(共享区)是高效的I/O映射方式,用于装载一个共享的动态内存库.用户可使用系统接口创建共享共享内存,做进程间通信. 堆用于程序运行时动态内存分配,堆是可以上增长的. 数据段(静态区)--存储全局数据和静态数据. 代码

  • 浅谈C++内存管理基础知识

    目录 概述 c++可用内存 c语言的可用内存 c++新增内存区域 new和malloc 智能指针引入 智能指针的实现 java延伸 java语言整体框架 java的垃圾回收机制 总结 概述 内存管理的原理庞大而复杂,然而这些都被操作系统进行了封装,并对外预留了API,这些api被c++调用,同时也被c++再次进行了封装,再面向程序员预留出了语法特性的接口,作为使用c++的程序员,我们只需要掌握c++预留的内存管理特性即可,就像我们开车不需要管变数箱.发动机是怎么变速.点火的,我们只需要掌握汽车给

  • 简单讲解Objective-C的基本特性及其内存管理方式

    一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应用程序. 拓展名:c语言-.c  OC语言.-m  兼容C++.-mm 注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具,抛开语法的差别外,我想最重要的应该是在解决问题的时候考虑的角度和方法不一样而已,然而这也构成了学习一门语言的重要性. 二.语法预览 (1)关键字 基本上所有

  • 深入讲解Swift的内存管理

    前言 LLVM编译器的好:Swift的内存管理除了要注意引用循环之外,几乎全部被LLVM编译器包揽,不需要开发人员操心. Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配.当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当一个对象没有引用的时候,其内存将会被自动回收.这套机制从很大程度上简化了我们的编码,我们只需要保证在合适的时候将引用置空 (比如超过作用域,或者手动设为 nil 等),就可以确保内

  • 跟我学习javascript的垃圾回收机制与内存管理

    一.垃圾回收机制-GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存. JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行. 不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生

  • 浅谈Android系统的基本体系结构与内存管理优化

    Android运行环境一览 Android基于linux内核,面向移动终端的操作系统.主要包括以下几个方面: Application Framework: 这一层为应用开发者提供了丰富的应用编程接口,如 Activity Manager,Content Provider,Notification Manager,以及各种窗口 Widget 资源等.所有的APP都是运行在这一层之上. Dalvik 虚拟机: Dalvik VM采用寄存器架构,而不是JVM的栈架构,更适于移动设备.java源代码经过

  • TensorFlow内存管理bfc算法实例

    1. 基本介绍 tensorflow设备内存管理模块实现了一个best-fit with coalescing算法(后文简称bfc算法). bfc算法是Doung Lea's malloc(dlmalloc)的一个非常简单的版本. 它具有内存分配.释放.碎片管理等基本功能. 2. bfc基本算法思想 1. 数据结构 整个内存空间由一个按基址升序排列的Chunk双向链表来表示,它们的直接前趋和后继必须在地址连续的内存空间.Chunk结构体里含有实际大小.请求大小.是否被占用.基址.直接前趋.直接后

  • C/C++中的内存管理小结

    前言 我们最初熟知的内存开辟方式: int val = 20: 在栈空间上开辟4个字节 char array[10]: 在栈空间上开辟10个字节的连续空间 上述开辟空间的方式有两个特点: 空间开辟大小是固定的. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配. 但是对于空间的需求,不仅仅是上述的情况,有时候我们需要的空大小在程序运行时才能知道,那此时静态的开辟空间的方式就不能满足了,我们这时候只能试试动态内存开辟. 这篇博客就来带大家梳理一下C/C++中的内存管理. 一:C/C

随机推荐