iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >Net内存管理五大基础
  • 748
分享到

Net内存管理五大基础

2024-04-02 19:04:59 748人浏览 八月长安
摘要

目录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内存管理五大基础内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Net内存管理五大基础

本文链接: https://www.lsjlt.com/news/154764.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Net内存管理五大基础
    目录1.小对象怎么处理的?2.较大的对象会怎样?3.垃圾收集器可以在不同的模式下运行以优化性能4.引用不足会在性能和内存效率之间折衷5.对象固定可以创建在托管和非托管...
    99+
    2024-04-02
  • 浅谈C++内存管理基础知识
    目录概述c++可用内存c语言的可用内存c++新增内存区域new和malloc智能指针引入智能指针的实现java延伸java语言整体框架java的垃圾回收机制总结 概述 内存管理的原理...
    99+
    2024-04-02
  • C/C++内存管理基础与面试
    目录1.C/C++内存分布2.C语言中动态内存管理方式3.C++中动态内存管理方式3.1 对于内置类型3.2 对于自定义类型3.3 new的底层原理4. 常见的面试题1.C/C++内...
    99+
    2024-04-02
  • JavaScript 内存管理:从基础到高级
    基础:垃圾回收 (GC) JavaScript 使用自动垃圾回收 (GC) 机制来管理内存。GC 定期扫描堆内存,识别和释放不再引用的对象,释放它们占用的内存空间。 堆和栈内存 JavaScript 程序使用两个主要的内存区域: 堆:存...
    99+
    2024-04-02
  • mysql基础(五)查询缓存
    缓存的有缺点     1、如果命中缓存,直接从缓存中返回,减少分析和执行SQL语句的过程,提高查询效率     2、缓存会带来...
    99+
    2024-04-02
  • golang函数大内存管理策略
    go中,管理大内存可用切片和映射:切片:引用底层数组的动态数组,高效分配和释放内存。映射:键值对的动态集合,使用哈希表实现快速查找。通过pprof分析,可了解切片和映射在不同场景下的内存...
    99+
    2024-04-23
    golang 内存管理 键值对
  • .net core中高效的动态内存管理方案
    .net core在新增的System.Buffers中引入了一大堆高效内存管理的类,如span和memory、内存池。本文今天这里介绍一个高效动态内存访问方案。 ReadOnlyS...
    99+
    2024-04-02
  • Redis中的五大基础类型是什么
    这篇“Redis中的五大基础类型是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Red...
    99+
    2024-04-02
  • 【内存取证】基础知识(volatility内存取证)
    目录 一、基本概念 二、运行内存镜像的获取 2.1 Windows内存镜像获取 2.1.1 Magnet RAM Capture获取内存镜像 2.1.2 AccessData FTK Imager软件获取内存镜像 2.1.3 DumpIt软...
    99+
    2023-09-06
    linux 运维 服务器
  • Aerospike的bin内存管理--即列内存管理
    1、内存申请函数调用 write_master->write_master_dim->write_master_bin_ops ->write_master_bin_ops_l...
    99+
    2024-04-02
  • golang函数内存管理基准测试
    使用指针(benchmarkpointer)提供了最佳函数内存管理性能,其次是引用传递(benchmarkrefpass),最后是值传递(benchmarkvaluepass)。 Go...
    99+
    2024-04-24
    golang 内存管理
  • JavaScript 内存管理与大型数据集
    1. 对象池化 对象池化通过预分配和重用对象,避免频繁创建和销毁对象。这可以减少内存碎片并提高性能。 2. 弱引用 弱引用是一种特殊类型的引用,当不再需要对象时,不会阻止垃圾回收器释放内存。这对于缓存和大型数据集的临时处理很有用。 3. ...
    99+
    2024-04-02
  • SpringBoot2 基础案例(13):基于Cache注解,管理Redis缓存
    本文源码:GitHub·点这里 || GitEE·点这里一、Cache缓存简介从Spring3开始定义Cache和CacheManager接口来统一不同的缓存技术;Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;Cache接口...
    99+
    2023-06-02
  • Linux内核进程管理的基础是怎样的
    本篇文章为大家展示了Linux内核进程管理的基础是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。内核通过 task_struct 描述进程用命令 pstree 可以让内核以树形的结构把进程之间...
    99+
    2023-06-15
  • .Net Framework类型基础的具体内容有哪些
    这期内容当中小编将会给大家带来有关.Net Framework类型基础的具体内容有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。.Net Framework作为一个开发环境对程序员来说是非常重要的。我...
    99+
    2023-06-17
  • 详解大数据处理引擎Flink内存管理
    目录内存模型内存管理自定义序列化框架缓存友好的数据结构内存模型 Flink可以使用堆内和堆外内存,内存模型如图所示: flink使用内存划分为堆内内存和堆外内存。按照用途可以划分...
    99+
    2024-04-02
  • C++ 内存管理中的内存池
    内存池是一种 c++++ 技术,用于管理频繁分配和释放的特定大小对象。它使用预分配的内存块,提供比标准内存分配器更高的性能,特别是针对高度并发的应用程序。 C++ 内存管理中的内存池 ...
    99+
    2024-05-01
    内存池 c++ 内存管理 c++
  • Java基础详解之内存泄漏
    目录一、什么是内存泄漏二、Java内存泄漏引起的原因三、内存泄漏的危害一、什么是内存泄漏 内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对...
    99+
    2024-04-02
  • Maven基础知识大梳理
    目录Maven工程基础知识Maven仓库的分类Maven常用命令的含义一个项目生命周期打包类型:<packaging >依赖范围:<scope>聚合与继承的关...
    99+
    2024-04-02
  • JVM内存管理之JAVA语言的内存管理详解
    引言内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。可怕的事情还不只...
    99+
    2023-05-31
    jvm 内存管理 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作