本篇博客写于 2023-01-21,现在从我的旧博客搬运过来,当时还没有 ChatGPT,我翻译的一般,可能会有错误,请见谅,原地址:https://blog.kitlau.dev/posts/cartoon-dotnet-garbage-collection/
今天是 2023 年 1 月 21 日,农历大年三十。祝大家兔年发财,心想事成!希望自己在兔年可以跟喜欢的女孩一起快乐生活😁。
0. 为什么会有这篇博客
在工作中,我发现国内许多跟我水平相近的普通 dotnet 开发者对 dotnet 的一些基础知识并不了解,我们实际上只是在流水线上写代码,写增删改查,这显然对我们技术路线职业发展不利。我认为很大原因是国内的中小公司不重视技术,眼里只有业务,他们需要的实际上是能像流水线工人一样写增删改查的熟练工,而不是有创造力的开发者。
要想在这种流水线工作上找点乐子,性能优化是个不错的学习的点。dotnet 性能优化基本都要从减少 GC 压力入手。刚好我从网上看到这样一幅简单的介绍 dotnet GC 的漫画,就简单翻译一下,做一个最基础的科普。
1. 来源
该漫画来自 Redgate。具体地址我不知道,我是拿的网友转载的,网友没有给出地址。但应该是 .NET Framework 时代的东西了。在 dotnet 5 中,GC 新增了新的分代 POH,我也不太了解,感兴趣的朋友可以自行查阅资料。
这幅漫画是我很久之前翻译的,但被工作耽误了,一直没有发出来,今天清理磁盘的时候才发现。当时可能有一些不好的翻译和错误的理解,但是过年很忙,我懒得重新校正这些错误了。
2. 翻译
可以保存到本地或者放大后看。文本还是清晰的。
![]() |
---|
图 1 - 翻译 |
3. 关于 LOH(大对象堆)压缩问题的“解决方案”
有位大佬 @lorenzo_solano 给出了大对象堆压缩问题的“解决方案”,做如下设置:GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce
。
这是把 GC 的 LOH 压缩模式设置为了“压缩一次”。
你要么周期性地调用它,要么用一些启发式的方法。“解决方案”加引号是因为它只在下一个 GC 周期有效,我们回到了手动内存管理。但更糟糕的是不知道什么时候该这么做。
这个解决方案来自 @lorenzo_solano 的演讲:Benefits of Being a "Real" Polyglot Programmer(成为“真正的”多语言程序员的好处)。
4. 原漫画
![]() |
---|
图 2 - 原漫画 |
首先,我要赞赏你的这篇博客,因为你不仅分享了.NET垃圾收集(GC)的原理,而且还以漫画的形式,使得这个复杂的主题更易于理解。你的博客对于那些希望深入了解.NET的开发者来说,无疑是非常有帮助的。
你的主要观点是,许多.NET开发者并不了解一些基础知识,这在很大程度上是因为他们的公司只关注业务,而不注重技术。你提出性能优化是一个可以提升技术水平的学习点,这个观点我非常赞同。只有了解并掌握了这些底层的原理,才能在性能优化方面做出更有针对性的改进。
你用漫画的形式解释了.NET的垃圾收集原理,这是这篇博客的亮点。这种方式既直观又有趣,对于初学者来说,无疑是更容易理解和接受的。你还引用了大佬@lorenzo_solano的解决方案,这也是一个很好的信息来源。
然而,我发现你在博客中提到,你没有重新校正可能存在的翻译错误和理解错误,这可能会对读者理解造成一定的困扰。我建议你在有空的时候,可以重新审查一下这个博客,修正可能存在的错误。此外,你还可以在博客中添加一些你自己对于.NET垃圾收集原理的理解和见解,这样可以使你的博客更具个人色彩和深度。
总的来说,这是一篇很好的博客,你的努力和热情在其中得到了很好的体现。希望你能继续分享更多的知识和经验,帮助更多的开发者提升他们的技术水平。
首先,我要赞赏你的分享精神和对深入理解技术的追求。你的博客为.NET开发者提供了一种轻松的方式来理解.NET垃圾收集(GC)的原理,这是非常值得赞赏的。
文章的核心理念是帮助.NET开发者深入理解垃圾收集机制,以便更好地进行性能优化。你通过漫画的形式,使得这个复杂的主题变得更为生动和易于理解,这是你文章的一个亮点。同时,你对于漫画的翻译也非常到位,让读者可以更好地理解漫画的内容。
然而,文章中也存在一些可以改进的地方。首先,你提到这幅漫画是".NET Framework时代的东西了",但在.NET 5中,GC新增了新的分代POH,你自己也不太了解。我建议你可以进一步研究这个新的特性,并在博文中进行补充,这样可以使你的文章更加完整和及时。
其次,你提到了关于LOH(大对象堆)压缩问题的“解决方案”,但并没有详细解释这个解决方案的具体内容和使用场景。我建议你可以详细解释这个解决方案,以及为什么它只在下一个GC周期有效,这样可以帮助读者更好地理解和使用这个解决方案。
最后,你在文章中提到了一些个人的看法和情感,如"国内的中小公司不重视技术,眼里只有业务",以及对新年的祝福和个人愿望。这些内容虽然增加了文章的人情味,但可能会让一些只想获取技术信息的读者感到分心。我建议你可以将这些内容移至文章的开头或结尾,以便读者可以更专注于文章的主题。
总的来说,你的文章为.NET开发者提供了一种生动有趣的方式来理解.NET垃圾收集(GC)的原理,这是非常值得赞赏的。希望你可以继续分享你的知识和经验,帮助更多的开发者提升他们的技术水平。