C# 内存管理优化畅想(三)---- 其他方法&结语
前两篇文章提出的优化方法,都是不需要修改源代码的,而是在CLR或JIT层面进行自动优化的。但本文中提出的优化方法则需要引入新的语法,开发者只有在源代码中使用了这些新语法,才会获得优化。
1. 允许对象“嵌入式”组合:说白了,就是允许一个对象包含其他对象(包含的是对象本身,而非其引用),这样就把多个对象合并成了一个对象,减少了对象的数量,自然GC的压力就轻了。被包含的对象其实就相当于一个结构体(struct),禁止持有其引用。如果被包含对象是数组,至少应允许固定长度的情况,至于是否允许变长,则要看实现的难易程度了。
相关英文贴:
https://github.com/dotnet/roslyn/issues/2097
https://github.com/dotnet/roslyn/issues/6055
2. 把弱引用“升级”为语言特性,而不是作为一个类(为了兼容,原来的弱引用类也要保留)。目前的弱引用实现是CLR内部维护了长短两个弱引用表来记录弱引用,这样做似乎没有必要,而且引入了额外的开销,令使用者有所顾虑。既然GC之后CLR能够正确地更新本轮没被回收的对象的(强)引用,那么按理说也能更新本轮已被回收的对象的弱引用,并不需要额外的弱引用表,至少短弱引用是这样。如果能打消使用者的顾虑,使他们更近大胆地使用弱引用记录缓存,使用得当的话也是能给减轻GC的压力的。
相关英文贴:
https://github.com/dotnet/roslyn/issues/2171
3. 引入“引用计数”来辅助GC。可以让CLR针对开发者指定的类来维护其实例的引用计数,有了引用计数,可以实现两方面的优化。一是“写时复制”,即带有值类型特点的对象(类似string)可以被多处引用,只要不修改,就可以共享内存,而在修改时若引用计数为1则直接就地修改,若引用计数大于1,则先复制再修改复制的新对象。二是提前执行终结器,一旦某个对象的引用计数变为0,则立即执行其终结器函数(如果有的话),等到GC时即可直接回收其内存而无须再执行终结器,这就避免了终结器拖慢GC的积弊。当引用计数为0且无终结器时倒不是必须立即回收对象,因为这样做将在下次GC之前造成内存碎片,降低分配新对象的速度,有得有失,可以作为一个可选特性由使用者决定是否立即回收。
相关英文贴:
https://github.com/dotnet/coreclr/issues/1792
结语:到此为止,我所能想到的内存优化方法已经全部写完了,如果读者有更好的办法或者认为我的办法有缺陷,欢迎在评论中指出。
C# 内存管理优化畅想(三)---- 其他方法&结语的更多相关文章
- C# 内存管理优化畅想----前言
C#语法简洁.优雅,类库丰富,是我最喜爱的计算机语言,没有“之一”.但是,经过深入学习后发现,C#的内存管理,也就是通常所说的垃圾回收(GC)机制,虽然跟其他支持GC的语言相比,已经很优秀了,但与手动 ...
- C# 内存管理优化畅想(二)---- 巧用堆栈
这个优化方法比较易懂,就是对于仅在方法内部用到的对象,不再分配在堆上,而是直接在栈上分配,方法结束后立即回收,这将大大减轻GC的压力. 其实,这个优化方法就是java里的逃逸分析,不知为何.net里没 ...
- C# 内存管理优化畅想(一)---- 大对象堆(LOH)的压缩
我们都知道,.net的GC是不会压缩大对象堆的,因为其时间开销不可接受,但这是以大对象堆产生大块碎片为代价的,如果以后要分配的大对象比最大的碎片还大,那么即使它比所有碎片的总大小要小,也是无法在不扩展 ...
- LWJGL3的内存管理,第三篇,剩下的两种策略
LWJGL3的内存管理,第三篇,剩下的两种策略 上一篇讨论的基于 MemoryStack 类的栈上分配方式,是效率最高的,但是有些情况下无法使用.比如需要分配的内存较大,又或许生命周期较长.这时候就可 ...
- C# 内存管理优化实践
内存优化畅想系列文章已经结束了,很多读者读完之后可能觉得“然并卵”,毕竟都是给微软提的建议而已,现在都没有实现.那么为了优化内存,有没有什么我们现在就能用的技巧呢?我的答案是:有.网上关于.net内存 ...
- Objective-C 【在手动内存管理中如何写set方法】
------------------------------------------- set方法的内存管理 代码: #import <Foundation/Foundation.h> @ ...
- EasyDarwin开源流媒体服务器内存管理优化
-本文由EasyDarwin开源团队成员Fantasy贡献 前言 最近在linux上跑EasyDarwin发现一个很奇怪的问题,当有RTSPSession连接上来的时候,发现进程的虚拟内存映射一下就多 ...
- oc45--多对象内存管理 优化
// // main.m // Set方法的内存管理 #import <Foundation/Foundation.h> #import "Person.h" #imp ...
- 你必须了解的java内存管理机制(三)-垃圾标记
本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...
随机推荐
- jQuery设置按钮被点击状态
js和jquery如何使按钮失效,很简单,只要设置disabled属性为true即为不可用状态即可 1.JS方法一: document.getElementByIdx("btn") ...
- Google提议使用Jsonnet来增强JSON
Google开源了一门配置语言Jsonnet来取代JSON,它完全向后兼容并加入了一些新特性:注释.引用.算术运算.条件操作符,数组和对象内含,引入,函数,局部变量,继承等.Jsonnet程序被翻译为 ...
- C#与C++、Java之比较概览
转自C#与C++.Java之比较概览 C#与C++.Java之比较概览 Ben Albahari 著 荣耀 译 本文翻译时间较早.欢迎指出任何误失.谢谢. 感谢以下人士的支持和反馈(按字母先后顺序) ...
- mysql中TimeStamp和Date的转换
mysql 查询时间戳(TIMESTAMP)转成常用可读时间格式 from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接 ...
- vim下如何删除某行之后的所有行
使用dG进行删除 在命令模式下将光标置于要删除的起始行,然后依次输入d,G
- iPhone之Quartz 2D系列--图形上下文(2)(Graphics Contexts)
以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 iPhone之Quartz ...
- 关于谷歌android 4.3 ble问题
随着BLE的逐渐壮大,越来越多的厂商开始支持BLE,在未来的一年里应该会慢慢普及,谷歌android4.3已经支持了自己的nexus4和uexus7 2013手机了,也就是说如果厂商采用谷歌已经实现d ...
- [LeetCode#84]Largest Rectangle in Histogram
Problem: Given n non-negative integers representing the histogram's bar height where the width of ea ...
- Ubuntu 桌面歌词
Ubuntu 有个用来显示歌词软件叫 osd-lyrics. 这个软件的强大之处在于他可以和各种播放器配合, 并且可以自动下载歌词. 自从升级到14.04后不能用了,便以为该软件被废弃了. 无意中发现 ...
- 【转】 各种 基于Unity3d 引擎的Android游戏优化 (drawcall)
合并纹理,减少贴图数量,合并网格,ui上减少不必要的层级叠加关系等 1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式 ...