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内存管理五大基础知识相关推荐

  1. linux的硬件系统管理,Linux 系统硬件管理的基础知识(四)

    以下主要介绍我的***次安装Linux系统遭遇,以及怎么度过这个遭遇的,希望对大家有所帮助.不喜欢的可以略过.以下接<Linux 系统硬件管理的基础知识(三)>. 四.关于存储设备的不同的 ...

  2. 管理的基础知识都包含哪些内容

    首先,要学习管理基础知识最好的办法是多阅读一些管理方面的经典著作.我个人比较推荐你看些类似<经理人参阅:企业管理实务>这样的书籍,能让你快速入门管理学及建立企业管理的专业知识体系. 那么, ...

  3. java继承原理内存角度_Java基础知识巩固

    最近发现自己的Java基础知识还是有点薄弱,刚好有点空闲时间进行再补一补,然后进行整理一下,方便自己以后复习.其实个人认为Java基础还是很重要的,不管从事Java后端开发还是Android开发,Ja ...

  4. ios内存管理机制基础

    采用引用计数的方式来管理内存,分MRC和ARC两种,其中ARC是基于MRC的. 在MRC中, 每当我们使用alloc,new,retain,copy使对象的引用计数增加,都要对应的使用release或 ...

  5. cuda 本地内存使用_CUDA 基础知识博客整理

    CUDA 0.0 腾讯云CUDA环境搭建 1.0 并行计算与计算机架构 1.1 异构计算与CUDA 2.0 CUDA编程模型概述(一) 2.1 CUDA编程模型概述(二) 2.2 给核函数计时 2.3 ...

  6. java与c内存管理_Java基础--Java内存管理与垃圾回收

    Java自动内存管理 在讲解内存管理之前,首先需要了解对象和对象引用的区别 对象是类的一个实例,以人这个类为例,Person是我们定义的一个类 public class Person{} public ...

  7. linux进程管理内存管理,Linux专业知识四:Linux系统进程管理及查看内存

    本文主讲Linux专业知识之Linux系统进程管理及查看内存的情况,以Redhat RHEL7操作系统为例. 一.进程 程序与进程:程序是静态的(文件),进程是动态的(运行的程序). 进程和线程:一个 ...

  8. 内存马涉及基础知识整理

    内存马简介 1.1 webshell变迁 web服务器管理页面--> 大马-->小马拉大马-->一句话木马-->加密一句话木马 内存马是无文件攻击的一种常用手段,随着攻防演练热 ...

  9. Android允许后台活动管理,安卓基础知识(活动)

    一.四大组件 Android系统四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver)和内容提供器(Content Provider).其中 ...

最新文章

  1. 第十、十一周项目一-点-圆-圆柱类族的设计(2)
  2. 工程优化作业——成功失败法和黄金分割法
  3. Py之textgenrnn:textgenrnn库的简介、安装、使用方法详细攻略
  4. Java中怎样根据对象list的某对象的属性进行分组
  5. Qt for Android获取手机序列号/手机型号/手机制造商
  6. zeppelin安装使用
  7. UVALive 4764 dp
  8. js系列教程6-BOM操作全解
  9. 一路波折----记我的win10环境下scala安装之路,解决命令窗口报错问题
  10. 打开WORD 2003时提示发现错误,需要关闭,还要发送错误报告给Microsoft 解决方案...
  11. 2021年中国上市公司发明授权数量及分布:发明授权数量连续5年增长,广东省位居全国第一[图]
  12. Python -- 创建数字列表
  13. echarts中的x轴y轴颜色,文字颜色改变
  14. 医院信息系统基本功能规范---医疗保险接口功能规范
  15. 如何设置一个按钮 左边方形右边圆形
  16. Nginx 监控模块
  17. k8s源码分析--kube-scheduler源码(一)
  18. 用python画雪人-萌系新潮玩,唱多多小雪人麦克风天猫独家首发
  19. linux bash环境下面给expect脚本传递参数
  20. 虚拟机使用docker搭建Prometheus

热门文章

  1. DOM节点创建(jQuery)
  2. 关于他们回答的 怎样在桌面建一个python GUI的快捷方式 这个问题
  3. MVC-控制器向View传值的三种方法
  4. JavaScript自动设置IFrame高度(兼容各主流浏览器)
  5. Teams Developer Portal介绍
  6. 用Vue搭建一个应用盒子(二):datetime-picker
  7. Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
  8. Sonnedix收购意大利11.2MW光伏电站产品组合
  9. 使用gulp-connect实现web服务器
  10. Serializable和Parcelable