首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

优化C#服务器的思路和工具的使用

还有一种采集, 就是内存快照, 可以通过dotMemory来搞, 直接用VS获取内存快照最后会发现看不清楚. dotMemory在这方面做得不错....内存快照 dotMemory这个工具获取内存快照这方面做得非常好, Windows和Linux下均可以使用, 其中Linux是命令行程序获取数据, 然后Windows客户端可以打开结果分析....之前跑机器人战斗的时候, 发现内存占用越来越大, 然后通过dotMemory获取快照, 发现LuaEnv占用内存非常多, 然后找到某一个LuaEnv, 详细的查看其内存占用....还有dotMemoryDominators, 可以分析出各个系统之间的内存占用, 例如下图中, 道具占比有一点不太正常, 研究发现每个装备都缓存了大概25K的数据而且从来都没有使用过....-位图索引 C#软件架构设计原则 .NET周刊【10月2期 2023-10-08】

19930

字符串池化,减少了三分之一的内存占用

在业务,我们假设如下: 有一百万个商品,每个商品都有一个 ProductId 和 Color 列保存在数据库 需要将所有的数据加载到内存,作为缓存使用 每个产品都有 Color Color 的范围是一个有限的范围...,我们通过dotMemory.Check()来捕捉当前内存快照,以便后续进行对比 字典创建完毕,我们比对前后两次检查点中新增的对象的大小。...使用 Dapper 读取 DataReader 并且全部载入字典 同样,我们运行 dotMemory 度量变化,可以得到数据为: 95.1 MB 因此,我们得出,采用这种方式,多消耗了 30MB 左右的内存...而 30MB 的临时字符串则会由于没有对象引用它们,因此最近的一次 GC 中会被立即回收,一切都是这样的轻松愉快。...view=net-5.0&WT.mc_id=DX-MVP-5003606 StringPool 是怎么实现的? 咱也不懂,咱也不敢乱说。总的来说是一个带有使用计数标记的优先队列。

46100
您找到你想要的搜索结果了吗?
是的
没有找到

字符串池化,减少了三分之一的内存占用

字符串池化,减少重复实例,内存降低,一切就是这样的轻松愉快。 开篇摘要 本文通过一个简单的业务场景,来描述如何通过字符串池化来减少内存的重复字符串实例,从而减少内存的占用。...在业务,我们假设如下: 有一百万个商品,每个商品都有一个 ProductId 和 Color 列保存在数据库 需要将所有的数据加载到内存,作为缓存使用 每个产品都有 Color Color 的范围是一个有限的范围...,我们通过dotMemory.Check()来捕捉当前内存快照,以便后续进行对比 字典创建完毕,我们比对前后两次检查点中新增的对象的大小。...使用 Dapper 读取 DataReader 并且全部载入字典 同样,我们运行 dotMemory 度量变化,可以得到数据为: 95.1 MB 因此,我们得出,采用这种方式,多消耗了 30MB 左右的内存...而 30MB 的临时字符串则会由于没有对象引用它们,因此最近的一次 GC 中会被立即回收,一切都是这样的轻松愉快。

41630

字符串池化,减少了三分之一的内存占用

在业务,我们假设如下: 有一百万个商品,每个商品都有一个 ProductId 和 Color 列保存在数据库 需要将所有的数据加载到内存,作为缓存使用 每个产品都有 Color Color 的范围是一个有限的范围...,我们通过dotMemory.Check()来捕捉当前内存快照,以便后续进行对比 字典创建完毕,我们比对前后两次检查点中新增的对象的大小。...使用 Dapper 读取 DataReader 并且全部载入字典 同样,我们运行 dotMemory 度量变化,可以得到数据为: 95.1 MB 因此,我们得出,采用这种方式,多消耗了 30MB 左右的内存...而 30MB 的临时字符串则会由于没有对象引用它们,因此最近的一次 GC 中会被立即回收,一切都是这样的轻松愉快。...view=net-5.0&WT.mc_id=DT-MVP-5004283 StringPool 是怎么实现的? 咱也不懂,咱也不敢乱说。总的来说是一个带有使用计数标记的优先队列。源代码咱也读不懂。

20440

内存优化:Boxing

本系列描述的最佳实践使我们能够将 .NET 产品某些算法的性能提高 20%-50%。 您需要什么工具 我们进一步讨论之前,先看看我们需要的工具。...我们 JetBrains 使用的工具列表非常简短: dotMemory 内存分析器。无论您试图查找什么问题,分析算法始终相同: 启用内存流量收集的情况下开始分析您的应用程序。...您感兴趣的方法或功能完成工作收集内存快照。 打开快照并选择内存流量视图。 Heap Allocations Viewer插件。该插件会突出显示代码中分配内存的所有位置。...int类型本身只占用4字节,其次,栈内存的由执行线程方法栈管理,方法内声明的local变量、字面量更是能够IL编译期就预算出栈容量,效率远高于运行时堆内存GC体系 如何发现 使用 dotMemory,...如何发现 使用 dotMemory 比对两个快照 打开View memory allocations视图 找到产生大内存流量的集合类型 看看是否与 Dictionary.Resize、 List

9410

.NET周刊【8月1期 2023-08-06】

作者展示了如何使用他的库Sdcb.LibRaw来将RAW照片转换为Bitmap或者其他格式的图像,以及如何获取支持的相机列表。...这个问题看起来很简单,当然是“catch先执行、finally执行”了?真的是这样吗?....Net 程序 CLR(Common Language Runtime 公共语言运行时)上运行时,内存被从逻辑上划分为两个主要部分:堆和栈。...本地使用VS2022打包.NET6 API镜像,推送到腾讯云容器仓库,然后服务器上拉取并启动。 使用docker-compose命令来管理服务的启动、停止、重启等操作,查看服务的状态和网络。...、dotPeek、dotTrace、dotMemory 2023.2 Rider 快照分析 dotTrace * 采样、跟踪、按线程分组的逐行快照 * Linux 和 macOS 上的源代码查看工具窗口

17110

10个用于C#.NET开发的基本调试工具

调试软件时,工具非常重要。获取正确的工具,然后再调试时提取正确的信息。根据获取的正确的错误信息,可以找到问题的根源所在。找到问题根源所在,你就能够解决该错误了。...优化代码,将不会遇到某些断点,也不会显示某些局部变量。这几乎破坏了调试体验。解决方案是使用dsSpy启动进程,而不是附加到进程。...OzCode允许调试过程以几乎完美的方式研究LINQ表达式。 ? 要了解有关使用或不使用OzCode调试LINQ的更多信息,请查看我的文章:如何在C#调试LINQ查询。 3....以下是一些可以使用性能计数器衡量的事情的示例: CPU使用内存使用率 进程引发的异常数 I/O字节的读写 对你的asp.net应用程序的请求数 asp.net应用程序请求响应时间 你可能会监视成千上万种不同的计数器...其中提到了一些可以用其类别的类似工具代替。例如,你可以将dotMemory用作内存分析器,Visual Studio的内置分析器甚至PrefView。

2.5K50

怎样修复 Web 程序内存泄漏

(当然,服务端渲染的网站也可能会泄漏服务器端的内存。但是客户端泄漏内存的可能性很小,因为每次你页面之间导航时浏览器都会清除内存。) Web 开发文献没有很好地解决内存泄漏问题的方法。... Chrome Dev Tools,我们选择的主要工具是“内存(Memory)”标签的“堆快照(heap snapshot)”。...可将其视为时间暂停,代表该网页使用的所有内存。 下一步是重现你认为可能正在泄漏的某些场景,例如,打开和关闭模态对话框。对话框关闭,你希望内存恢复到上一级。...Chrome 连续产生多个快照才能真正清除未引用的内存。...但是堆快照工具有几个限制: 如果保存并重新加载快照文件,则所有文件引用都将会丢失到分配对象的位置。例如你不会看到 foo.js 22 行的事件监听器的关闭。

3.2K30

JavaScript性能优化

: 发现垃圾时立即回收 最大限度减少程序暂停(应用程序执行的过程中会对内存进行消耗,内存是有限制的,当内存将要爆满的时候引用计数就会立即找到引用数0的内存空间立即释放) 引用计数算法的缺点: 无法回收循环引用的对象...回收内存空间,如下面的图示 相对于之前的标记清除算法就不会大量的分散的碎小的空间,使得回收的空间尽量是连续的 ?...使用 Timeline 记录可视化一段时间内的内存使用使用快照确定已分离的 DOM 树(内存泄漏的常见原因)。 使用分配时间线记录了解新内存在 JS 堆的分配时间。...堆快照查找分离DOM 界面元素存活在DOM树上 垃圾对象时的DOM节点(从DOM树上脱离,JS代码也没有引用) 分离状态的DOM节点(从DOM树上脱离,JS代码存在引用,那么这样是有问题的占用内存...之后点击按钮,然后点击生成快照,看一下两个快照有什么不同,如下图所示点击按钮之后确实在堆中生成了DOM但是并没有DOM树上引用,这样其实是占用空间,浪费空间的,解决方案:「确定不使用的地方直接置为

1.1K10

Redis面试(四):持久化

指定这key60s后过期,60s,redis是如何处理的嘛?我们先来介绍几种过期策略:定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。...该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。...Redisv4.0 增加以下两种:volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key使用LFU算法进行删除key。...图片3.3 Redis 的持久化机制[❤️]Redis 的读写操作都是在内存,所以 Redis 性能才会高,但是当 Redis 重启内存的数据就会丢 失,那为了保证内存的数据不会丢失,Redis...一定间隔时间做一次备份,所以如果 Redis 意外 down 掉的话,就会丢失最后一次快照的所有修改。新老版本存在RDB格式兼容问题总结:适用于数据要求不严谨的情况下。

29830

面试必备(背)--Redis八股文系列

定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。...该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的 CPU 资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。...该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。...当一个从数据库启动时,它会向主数据库发送一个SYNC命令,master收到,在后台保存快照,也就是我们说的RDB持久化,当然保存快照是需要消耗时间的,并且redis是单线程的,保存快照期间redis...使用 SETNX 完成同步锁的流程及事项如下: 使用 SETNX 命令获取锁,若返回0(key已存在,锁已存在)则获取失败,反之获取成功; 为了防止获取程序出现异常,导致其他线程/进程调用SETNX

1.2K41

dotnet 6 Win7 系统证书链错误导致 HttpWebRequest 内存泄露

为了确定是哪个方式导致的 OOM 了,可以先使用排除的方式,如果是某个业务申请大量的内存导致内存泄露,这是非常好也非常方便调试出来的,只需要使用 dotMemory 工具分析一下即可 开始使用 dotMemory...使用 7z 是因为可以很大的压缩 DUMP 文件。通过 dotMemory 分析没有看到有哪个业务使用了大量的内存,总的 .NET 内存占用实际上才不到 100MB 大小。...不会有的,放心吧,调试内存泄露方面,使用 VisualStudio 和 dotMemory 的能力是完全相同的,只是 VisualStudio 的交互做的太过垃圾,完全不如 dotMemory 的交互形式...那可能的原因实际上可以分为三个: 迁移 dotnet 6 过程,与 .NET Framework 的变更导致的问题 由于 dotnet 6 的机制变更,与 .NET Framework 的不相同,导致的内存回收策略变更的内存泄露问题...是我定制的版本,改了不少的内容 再定位是否迁移 dotnet 6 过程,与 .NET Framework 的变更导致的问题,我寻找了所有的变更逻辑,逐个还原,或者使用 Fake 逻辑,干掉对应的功能

1.1K20

商品详情页架构和Redis安装及持久化

缓存生产服务监听mq消息队列,监听到消息,经过业务逻辑计算,生成对应的模板数据缓存到缓存服务的ehcahe,redis, 将商品模板放在nginx服务器,前端来访问的时候时时从redis获取数据渲染模板直接返回前端...(fork子进程的时候不能提供读写) 对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大 AOF开启,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件...(2)打开AOF的开关,启用AOF持久化 (3)写入一些数据,观察AOF文件的日志内容 其实你appendonly.aof文件,可以看到刚写的日志,它们其实就是先写入os cache的,然后1秒才...,很多数据可能会自动过期,可能会被用户删除,可能会被redis用缓存清除的算法清理掉 redis的数据会不断淘汰掉旧的,就一部分常用的数据会被自动保留在redis内存 所以可能很多之前的已经被清理掉的数据...redis默认是使用LRU算法 LRU:是最近最少使用 redis.conf配置,主要下面3个参数 maxmemory:设置redis用来存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用

30930

对线面试官-Redis(内存消耗的问题)

该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。...通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以不同情况下使得CPU和内存资源达到最优的平衡效果。 派大星:Redis同时使用了惰性过期和定期过期两种过期策略。...派大星:可以通过maxmemory-policy进行配置,设置内存达到最大闲置,采取什么策略来处理。...maxmemory用来设置redis存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用LRU算法清理掉部分数据。...派大星:了解一些 RDB是以快照的形式获取内存某一时间点的数据副本,创建RDB文件的时候可以通过save和bgsave命令执行创建RDB文件。

15110

论程序的健壮性——就看Redis

因为Redis同时使用了惰性过期和定期过期两种过期策略,所以不同情况下使得 CPU 和内存资源达到最优的平衡效果的同时,保证过期的数据会被及时清除掉。...二、 Redis的数据持久化策略——宕机可立即恢复数据到内存 有了内存不会溢出保障,我们再来看看Redis是如何保障服务器宕机或重启,原来缓存在内存的数据是不会丢失的。...RDB快照(Redis DataBase),当触发一定条件的时候,会把当前内存的数据写入磁盘,生成一个快照文件dump.rdb。Redis重启会通过dump.rdb文件恢复数据。...执行save命令在生成快照的时候会阻塞当前Redis服务器,Redis不能处理其他命令。如果内存的数据比较多,会造成Redis长时间的阻塞。生产环境不建议使用这个命令。...我们不是直接去获取Redis主服务的地址,而是根据sentinel去自动获取谁是主机,即使主机发生故障我们也不用改代码的连接! ?

66031

《面试八股文》之 Redis 16卷

过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。...该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。...该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。...热 key 就是说,某一时刻,有非常多的请求访问某个 key,流量过大,导致该 redi 服务器宕机 解决方案: 可以将结果缓存到本地内存 将热 key 分散到不同的服务器 设置永不过期 9....1.当一个从数据库启动时,它会向主数据库发送一个SYNC命令,master收到,在后台保存快照,也就是我们说的RDB持久化,当然保存快照是需要消耗时间的,并且redis是单线程的,保存快照期间redis

32820

《面试八股文》之 Redis 16卷

---- RDB: 把某个时间点 redis 内存的数据以二进制的形式存储的一个.rdb为后缀的文件当中,也就是「周期性的备份redis的整个数据」,这是redis默认的持久化方式,也就是我们说的快照...定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。...该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。...该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。...1.当一个从数据库启动时,它会向主数据库发送一个SYNC命令,master收到,在后台保存快照,也就是我们说的RDB持久化,当然保存快照是需要消耗时间的,并且redis是单线程的,保存快照期间redis

77320

关于Redis,我们需要关注哪些技术点?

过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。...该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。...该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。...热 key 就是说,某一时刻,有非常多的请求访问某个 key,流量过大,导致该 redi 服务器宕机 解决方案: 可以将结果缓存到本地内存 将热 key 分散到不同的服务器 设置永不过期 9....1.当一个从数据库启动时,它会向主数据库发送一个SYNC命令,master收到,在后台保存快照,也就是我们说的RDB持久化,当然保存快照是需要消耗时间的,并且redis是单线程的,保存快照期间redis

46540
领券