.Net性能调优-垃圾回收!!!最全垃圾回收来了

目前项目开发基本都基于.NetCore 3.1以上了,有些老版本的规则和概念也没有列出来,低版本的垃圾回收类型和内存释放方式会有所不同

垃圾回收器为什么存在

  • 开发人员不必手动释放内存。

  • 有效分配托管堆上的对象。

  • 回收不再使用的对象,清除它们的内存,并保留内存以用于将来分配。 托管对象会自动获取干净的内容来开始,因此,它们的构造函数不必对每个数据字段进行初始化。

  • 通过确保对象不能使用另一个对象的内容来提供内存安全。

托管堆代数

概述

为优化垃圾回收器的性能,将托管堆分为三代:第 0 代、第 1 代和第 2 代。目的是为了单独处理短生存期对象和长生存期对象。垃圾回收器大部分时间都在处理短生存期对象的回收。

底层一代的GC回收会触发年轻一代的GC回收,第二代的GC回收会触发完整的GC回收.

第0代(暂时代)第1代(暂时代)第2代LOH(逻辑第3代)
所处内存段暂时段暂时段非暂时段非暂时段

LOH(大型对象堆)实际位于第二代
单独在第二代上为其划分了一块区域。
逻辑上称为第3代 |
| 包含 | 短生存期对象,即新分配的对象 | 短生存期对象,从第0代回收后,
未被回收的对象升级为第1代。 | 长生存期的对象,第一代回收后,
未被回收的对象升级为第2代。 | 对象的大小>= 85,000 字节 |
| 回收条件 | 第0代已分配内存达到阈值
如果第0代已满,仍尝试创建新对象
调用GC.Collect()方法
第1代GC回收 | 第1代已分配内存达到阈值
第0代回收之后仍然没有足够的空间存放新对象(此时会先回收第1代,再回收第2代)
调用GC.Collect方法
第2代GC回收 | 第2代已分配内存达到阈值
第0代回收之后仍然没有足够的空间存放新对象(此时会先回收第1代,再回收第2代)
调用GC.Collect方法
达到LOH回收条件
系统内存不足 | 达到第2代回收条件
大型对象内存分配达到阈值 |
| 回收方式 | 前台垃圾回收,当前托管线程被挂起 | 前台垃圾回收,当前托管线程被挂起 | 后台垃圾回收,当前托管线程正常执行 | 同第二代 |
| | | | | |

想要判断一个对象是否为大对象,可通过以下代码查看

var o = new Byte[85000];
Console.WriteLine(GC.GetGeneration(o));//GC2,大对象
o = new Byte[84900]; 
Console.WriteLine(GC.GetGeneration(o));  //GC0,小对象 84999仍是大对象,需要用一定量的内存空间保存指针 
var arr = new int[85000 / 4];	
Console.WriteLine(GC.GetGeneration(arr));//GC2,大对象,数组会提前开辟空间, int占32位,4个字节,85000 / 4加上指针内容会达到大对象的大小
arr = new int[85000 / 4 - 20];  
Console.WriteLine(GC.GetGeneration(arr));//GC0,小对象

阈值

当垃圾回收器检测到某个代中的幸存率很高时,它会增加该代的分配阈值,避免垃圾回收过于频繁地运行

但是阈值调大之后,会导致一次回收的内存过高。

所以阈值由CLR动态决定,以调节 回收频率单次回收内存大小的平衡

垃圾回收类型

工作站(默认方式)服务器
特点垃圾回收线程同用户线程优先级相同,会与用户线程争用CPU资源
只有一个处理器的计算机无论是否修改配置文件最终都会应用工作站垃圾回收方式有垃圾回收的专用线程

线程优先级为THREAD_PRIORITY_HIGHEST 每个CPU都会分配一个垃圾回收专用线程和专用堆。不同的堆可以互通
多个垃圾回收线程一起工作,所以堆大小相同时,服务器垃圾回收比工作站垃圾回收快 |
| 适用场景 | 普通场景 | 需要高吞吐量和可伸缩性的服务器应用程序 |

内存释放

释放目标

GC释放应用程序不再使用的对象的内存,通过检查应用程序的根来确定不再使用的对象应用程序的根包括:静态字段、局部变量、CPU 寄存器、GC 句柄和终结队列

释放步骤

- 列出不可访问对象和幸存对象的地址块并**标记**
- 使用内存复制功能压缩可以访问的对象到不可访问的地址块中,就是把存活下来的对象重新排列到连续的内存块中
- 大对象通常不会压缩,因为大对象所占用的内存区域过大,移动成本太大
- 回收死空间
- 指针更正,让对象指针指向新地址,指针更正是因为压缩了对象,对象在内存中的位置发生了变化

代码调优

  • 始终调用引用对象的Dispose方法,始终在实现了IDisposable的类中正确实现析构函数
  • 静态类中分配的对象不再使用后及时删除
  • 禁止在IOC声明为单例生命周期的类中注入瞬时生命周期的对象
  • 非必要时不要创建大型对象
  • 可视情况用ValueTask来代替Task,Task为引用类型,cpu密集型的调用会频繁触发第0代的GC回收
  • 尽可能重复使用HttpClient
  • 使用ArrayPoolMemoryPool从缓冲池中租用对象空间
  • 使用弱引用WeakReference重复使用已不再使用但尚未被回收的对象

监控及调试

  • 监听垃圾回收 ETW 事件,可用PerfView查看ETW事件,适用于window平台。也可在代码中引入Microsoft.Diagnostics.Tracing.TraceEventnuget包在代码中监听指定的GC回收等事件自定义后续处理逻辑

  • 使用性能监视器Perfmon.exe,适用于windows平台

  • 使用SOS调试,抓取dump转储文件后用WinDbg进行分析诊断,适用范围较广,可看到最全的内存信息

  • .Net CLI工具dotnet-counters,可以看到大概的性能指标数据统计结果,适用于临时运行状况查看和监视

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平流式初沉池贮砂斗计算_城市污水处理厂产泥量的计算

污泥是污水处理过程的副产物,包括筛余物、沉泥、浮渣和剩余污泥等。污泥体积约占处理水量的0.3%~0.5%左右,如水进行深度处理,污泥量还可能增加0.5~1倍。一、污水处理污泥分类及特性1、按成分不同分污泥:以有机物为主要成分。其主要…

C# 图片加水印例程

using System;using System.IO;using System.Collections;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging; namespace Imag_writer{/// <summary>/// 水印的类型/// </summary>public enum WaterMarkType{ /// <summary&…

从N个元素中选择第i小的元素

时常在笔试,面试题中看到这个问题,《算法导论》中给出了很好的解答。 Selection of the ith smallest element of the array A can be done in θ(n) times. The psuedocode is following: CodeRandomized_Select(A,p,r,i){ if pr then return A[p] qRandomized_…

Blazor 模板化组件开发指南

翻译自 Waqas Anwar 2021年4月15日的文章 《A Developer’s Guide To Blazor Templated Components》 [1]在我之前的一篇文章 Blazor 组件入门指南中&#xff0c;我介绍了组件参数&#xff0c;并向您展示了如何将数据作为参数传递给 Blazor 组件以定制化其功能。在这篇文章中&a…

别太贪婪,这些技能能让你一辈子满足

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

纳尼???我JVM优化过头了,直接把异常信息优化没了?怎么办

你好呀&#xff0c;我是why。 你猜这次我又要写个啥没有卵用的知识点呢&#xff1f; 不好意思&#xff0c;问的稍微有点早了&#xff0c;啥提示都没给&#xff0c;咋猜呢&#xff0c;对吧&#xff1f; 先给你上个代码&#xff1a; public class ExceptionTest {public stati…

angular $watch

在scope内置的所有函数中&#xff0c;用得最多的可能就是$watch 函数了&#xff0c;当你的数据模型中某一部分发生变化时&#xff0c;$watch函数可以向你发出通知。你可以监控单个对象的属性&#xff0c;也可以监控需要经过计算的结果&#xff08;函数&#xff09;&#xff0c;…

C# 读写ACCESS的OLE对象,演示图片与长文件的读写

网络上的读写OLE对象的代码是多&#xff0c;不过多是转载的&#xff0c;大部分人从来都没实际测试过&#xff0c;只是COPY来COPY去。我重来没看到一个真正可以运行的东东。没办法&#xff0c;只有自力更生&#xff0c;花了一点时间出了点研究成果&#xff0c;写到这里做个记录。…

RHCE课程-初级部分6、编辑工具VIM,网络配置,进程优先,日志文件简介。

我们通常用各种编辑工具来处理文本文件 常用的编辑工具:VIVIMEMACSVI和VIM的区别它们都是多模式编辑器&#xff0c;不同的是vim 是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。vim的这些优势主要体现在以下几个方面&#xff1a;易…

WPF等待动画

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;02—代码如下一、CycleLoading.cs 代码如下using System.Win…

假期别在家里要发霉了?可以靠他们度过无聊时光

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

cs6序列号 mac版photoshop_重磅!Parallels Desktop 16 M1版发布

Parallels 现已发布 Parallels Desktop 16 技术预览版&#xff0c;可以在搭载 M1 芯片的 Mac 电脑上运行。该公司表示&#xff0c;它创建了一个 “使用 Apple M1 Mac 芯片硬件辅助虚拟化的新虚拟化引擎”&#xff0c;允许用户在虚拟机中运行基于 Arm 的操作系统&#xff0c;例如…

华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???

华为二面&#xff01;&#xff01;&#xff01;面试官直接问我Java中到底什么是NIO&#xff1f;这不是直接送分题&#xff1f;&#xff1f;&#xff1f;什么是NIO缓冲区(Buffer)缓冲区类型获取缓冲区核心属性核心方法非直接缓冲区和直接缓冲区非直接缓冲区直接缓冲区通道(Chann…

REST

REST 定义了一组体系架构原则&#xff0c;您可以根据这些原则设计以系统资源为中心的 Web 服务REST 对 Web 的影响非常大&#xff0c;由于其使用相当方便&#xff0c;已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。REST Web 服务&#xff0c;其具体实现应该遵循四个基本设计原…

Delphi中的容器类(3)

TBucketList和TObjectBucketList类 从Delphi6开始&#xff0c;VCL的Contnrs单元中又增加了两个新的容器类TBucketList和TObjectBucketList。TBucketList实际上也是一个简单基于哈希表的指针-指针对列表。接口定义如下&#xff1a; TBucketList class(TCustomBucketList)… pu…

修改PATH导致fedora无法登录XWindow

用过fedora的都了解到&#xff0c;如果要使用像ifconfig,arp等这些外部命令&#xff0c;就必需加入路径&#xff0c;有点麻烦&#xff08;我懒人一个-_-&#xff09;。所以我就在/etc/profile文件结尾处加入了一行&#xff1a;export PATH$PATH:/sbin很好&#xff0c;感觉上没问…

一文读懂哈希和一致性哈希算法

哈希 Hash 算法介绍哈希算法也叫散列算法, 不过英文单词都是 Hash, 简单一句话概括, 就是可以把任意长度的输入信息通过算法变换成固定长度的输出信息, 输出信息也就是哈希值, 通常哈希值的格式是16进制或者是10进制, 比如下面的使用 md5 哈希算法的示例md5("123456"…

延迟开学?这些教育读书公众号可以帮助孩子学习! 你都关注了吗?

全世界只有3.14 % 的人关注了青少年数学之旅受新型冠状病毒疫情影响&#xff0c;日前&#xff0c;教育部印发《关于2020年春季学期延期开学的通知》。推迟开学时间&#xff0c;意味着寒假的延长。为此&#xff0c;小编精选这些优质的教育号和读书号帮助孩子学习&#xff01;理想…

go方法的深入探究(7.21增补)

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff09;哪些类型可以有方法&#xff1a; 1&#xff09;只能对命名类型和命名类型的指针编写方法&#xff1b; 2&#xff09;不能对接口类型和接口类型的指针编写方法&#xff1b; 3&#xff09;只能在定义命名类型…

element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...

作者&#xff1a;凹凸实验室 链接&#xff1a;https://juejin.im/post/5ebb4346e51d451ef53793ad整体思路第一步是结合项目背景&#xff0c;调研比较优化的解决方案。 文件上传失败是老生常谈的问题&#xff0c;常用方案是将一个大文件切片成多个小文件&#xff0c;并行请求接口…