微软工程师展示不良代码如何导致 Windows 电脑运行速度减慢
Windows 10 支持即将到期,因此微软最近发出了提醒。这家科技巨头还公布了一份因不符合系统要求而无法升级到 Windows 11 的 Surface PC 清单。该公司的官方立场很简单:换一台新设备,最好是 Copilot+ PC。
与此同时,家庭用户也开始讨论如何应对这一即将到来的变化。对于那些仍在使用无法正式运行 Windows 11 的 2015 年前系统的用户来说,许多人认为应该使用 Windows 8/8.1,而不是 Windows 11,甚至 Windows 10,因为旧版操作系统给人的感觉更敏捷。
不过请记住,虽然这是一个有趣的话题,但 Windows 8.1 的支持早在 2023 年 1 月就已结束,因此回到 Windows 8.1 并不是一个安全的选择,导致系统运行缓慢和迟钝的一个原因往往是运行了不良的底层代码。
微软高级升级工程师 Matt Hamrick 就此在微软网站上发表了一篇博文,文章主题涉及 Windows 因优化不当而可能遇到的内存泄漏和内存不足(OOM)问题。
在这篇文章中,Hamrick 以一个更新过的 .NET 7 应用程序为例,解释了一个计算错误的配置生成器条目(ConfigurationBuilder)中的 reloadOnChange 参数是如何造成这一问题的。如果将其值设置为 “true” 而不是 “false”,应用程序就会出现内存泄漏的情况,导致系统运行缓慢或程序崩溃,甚至整个系统崩溃。
对于那些想知道的人来说,reloadOnChange 参数会告诉系统注意指定文件中修改过的设置。它基本上有助于动态重载,因为它会自动从内存中重载更新的设置。这样,应用程序中引用已设置配置的部分就能立即看到新值,而无需重新启动。因此,随着时间的推移,可用内存池会逐渐填满。
他解释道:
此代码运行得越频繁,其影响就越大。问题并不明显,但这是触发因素:.
reloadOnChange: true
....
reloadOnChange: true
...实际上,只有在使用自定义配置文件时,如果 ASP.NET 本身尚未自动使用(假设这些默认值尚未更改),则仅在应用程序启动期间使用。相反,如上所述,有些人错误地在 Controller 动作或中间件组件之类的东西中使用了这段代码来访问一些需要的配置值,而不知道它在后台做了什么(也不知道他们通常寻找的配置已经加载(和监控)到应用程序的配置系统中)。
Matt Hamrick 通过观察 GC(垃圾回收器).NET 内存管理器的内存转储,并使用 WinDbg(一种 Windows 调试实用程序)等多种工具,最终确定了有问题的代码。您可以在微软技术社区网站上找到完整的博文:
https://techcommunity.microsoft.com/blog/iis-support-blog/memory-leak-from-improper-usage-of-microsoft-extensions-configuration-apis-in-ne/4386407
虽然这里强调的例子是一个最初用 .NET 7 编码的应用程序,但 Hamrick 指出,这个问题并不是它所特有的,它也可能影响使用较新的 .NET 版本的应用程序,这些版本仍受支持。
评论功能已关闭