【C# .Net GC】延迟模式 latencyMode 通过API-GC调优
延迟模式 lowlatency
使用环境:后台工作方式只影响第 2 代中的垃圾回收;第 0 代和第 1 代中的垃圾回收始终是非并发的,因为它们完成的速度很快。GC模式是针对进程配置的,进程运行期间不能更改,但是应用程序使用GCsetting类的GClatencyMode属性对垃圾回收进行某种程度的控制。
延迟的定义:若要回收对象,垃圾回收器 (GC) 必须停止应用程序中所有正在执行的线程。 垃圾回收器处于活动状态的时间段称为延迟 (所有线程被暂停的时间)。
在某些情况下(例如当应用程序检索数据或显示内容时),关键时刻可能发生完整的垃圾回收,从而妨碍性能。 可以通过将 GCSettings.LatencyMode 属性设置为其中一个 System.Runtime.GCLatencyMode 值来调节垃圾回收的干扰。
低延迟设置
使用“低”延迟设置意味着垃圾回收器对应用程序的干扰较少。 垃圾回收在回收内存方面较为保守。
System.Runtime.GCLatencyMode 枚举提供两种低延迟设置:
GCLatencyMode.LowLatency 禁止第 2 代回收,仅执行第 0 代和第 1 代回收。 只能在短时间内使用。 在更长时间内,如果系统处于内存压力下,垃圾回收器将触发一次回收,这样会暂时暂停应用程序并中断对时间要求很急的操作。 此设置仅对工作站垃圾回收可用。
GCLatencyMode.SustainedLowLatency 禁止第 2 代前台回收,仅执行第 0 代、第 1 代回收和第 2 代后台回收。 它可以长时间使用,并对工作站和服务器垃圾回收都可用。 如果后台垃圾回收已禁用,则无法使用此设置。
在低延迟期间,除非发生以下情况,否则禁止第 2 代回收:
系统收到操作系统的低内存通知。
应用程序代码通过调用 GC.Collect 方法并将
generation参数指定为 2 来包含回收。
方案
下表列出了使用 GCLatencyMode 值的应用程序方案:
| 延迟模式 | 应用程序方案 |
|---|---|
| Batch | 对于不具有用户界面 (UI) 或服务器端操作的应用程序。 禁用后台垃圾回收后,这将是服务器垃圾回收的默认模式。 Batch 模式还会替代 gcConcurrent 设置,即它会阻止后台或并发回收。 |
| Interactive | 对于具有 UI 的大多数应用程序。 这是工作站垃圾回收的默认模式。 但是,如果托管了某个应用,则优先考虑托管进程的垃圾回收器设置。 |
| LowLatency | 对于具有短期时效性操作(操作期间垃圾回收器的干扰可能会引起中断)的应用程序。 例如,呈现动画或数据采集功能的应用程序。 |
| SustainedLowLatency | 适用于在有限但有可能更长的时间内具有时效性操作并且在此期间垃圾回收器中断具有破环性的应用程序。 例如,需要随着交易时间内的市场数据变化做出快速响应的应用程序。 此模式会比其他模式产生更大的托管堆大小。 由于它不压缩托管堆,因此可能产生更多碎片。 确保有足够的可用内存。 |
低延迟使用指南
使用 GCLatencyMode.LowLatency 模式时,请注意以下指导原则:
尽可能地缩短低延迟时段。
避免在低延迟时段分配大量内存。 由于垃圾回收回收的对象较少可能出现低内存通知。
在低延迟模式下,最大限度减少新的分配次数,尤其是分配到大型对象堆和固定对象的次数。
知道可以分配的线程。 由于 LatencyMode 属性设置属于进程范围的设置,因此可以在分配的任何线程上生成 OutOfMemoryException 异常。
将低延迟代码包装在受约束的执行区域中。 有关详细信息,请参阅受约束的执行区域。
在低延迟期间,可以通过调用 GC.Collect(Int32, GCCollectionMode) 方法强制进行第 2 代回收。
假如有 多个线程要操作这个设置,考虑用interlocked
LatencyMode使用案例
private static void LowLatencyDemo() {
GCLatencyMode oldMode = GCSettings.LatencyMode;
System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions(); //CER 约束执行区
try {
GCSettings.LatencyMode = GCLatencyMode.LowLatency;
// Run your code here...
}
finally {
GCSettings.LatencyMode = oldMode;
}
}
【C# .Net GC】延迟模式 latencyMode 通过API-GC调优的更多相关文章
- 成为Java GC专家(5)—Java性能调优原则
并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...
- GC调优在Spark应用中的实践(转载)
Spark是时下非常热门的大数据计算框架,以其卓越的性能优势.独特的架构.易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用.与Hadoop.HBase生态圈的众多项目一样,Spark的 ...
- GC调优在Spark应用中的实践[转]
作者:仲浩 出处:<程序员>电子刊5月B 摘要:Spark立足内存计算,常常需要在内存中存放大量数据,因此也更依赖JVM的垃圾回收机制.与此同时,它也兼容批处理和流式处理,对于程序 ...
- 一文读懂Java GC原理和调优
概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生产系统出现的GC问题进行排查解决 阅读时长约30分钟,内容主要如下: GC基础原理,涉 ...
- Linux低延迟服务器系统调优
最近做了一些系统和网络调优相关的测试,达到了期望的效果,有些感悟.同时,我也发现知乎上对Linux服务器低延迟技术的讨论比较欠缺(满嘴高并发现象):或者对现今cpu + 网卡的低延迟潜力认识不足(动辄 ...
- 老大难的GC原理及调优,这下全说清楚了
概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生产系统出现的GC问题进行排查解决 阅读时长约30分钟,内容主要如下: GC基础原理,涉 ...
- .NET 中 GC 的模式与风格
垃圾回收(GC)是托管语言必备的技术之一.GC 的性能是影响托管语言性能的关键.我们的 .NET 既能写桌面程序 (WINFROM , WPF) 又能写 web 程序 (ASP.NET CORE),甚 ...
- 讨论.NET Core 配置对GC 工作模式与内存的影响
引出问题: Asp.net core应用在 Kubernetes上内存使用率过高问题分析 https://mp.weixin.qq.com/s/PqhUzvFpzopU7rVRgdy7eg 这篇文章中 ...
- .NET Core 配置GC工作模式与内存的影响
.NET Core 配置GC工作模式与内存的影响 .NET Core GC 原文:https://blog.markvincze.com/troubleshooting-high-memory-usa ...
随机推荐
- golang中字符串、bytes类型切片、16进制字符串之间的转换
func main() { // 字符串转bytes类型 name := "马亚南" fmt.Println(name) // 马亚南 bName := []byte(name) ...
- 学习Java第9天
今天所作的工作: 反射,枚举类型与泛型 明天工作: 1.线程 2.网络通信 所遇到的问题及解决方法: 反射基本思想,泛型类似于类模板. 理解反射太难了,转悠了好半天,关键是理解反射的思想,才容易学.
- 如何在 python 中提取图片主题色
前言 在 Groove 音乐中,当我们改变歌曲时,底部播放栏的颜色会随专辑封面而变,比如下图中播放栏的颜色变成了 aiko 衣服的颜色.下面我们会在 python 中实现相同的效果,也就是提取出图片中 ...
- bom案例6-轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java.lang.Math类详解
Math类位于Java.lang包中,包含用于执行基本数学运算的方法!Math类的所有执行方法都是静态方法,可以直接使用类名.方法名调用,如:Math.round() 常用的方法:Math.round ...
- 使用Maven导入MySQL驱动包遇到的问题
问题描述 今天在使用Maven导入MySQL数据库驱动包依赖后,直接运行项目,出现错误. java.sql.SQLException: No suitable driver found for jdb ...
- Android--控件的滑动事件
感谢大佬:https://www.cnblogs.com/zkb-0928/p/3768209.html 感谢大佬:https://blog.csdn.net/sweiqin/article/deta ...
- Java 自定义窗体(标题栏、窗体背景)
感谢大佬:https://blog.csdn.net/ltx06/article/details/28996839 最近在书上看到这篇文章,觉得挺有意思.与大家分享一下,具体可以参见明日科技出版的&l ...
- 企业级Docker容器镜像仓库Harbor的搭建
Harbor简述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理 ...
- 学习:二维码、QR码、J4L-QRCode、java
开源码 Java 解码器(编码解码)下载:http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip Java QR Code O ...