前两篇文章提出的优化方法,都是不需要修改源代码的,而是在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# 内存管理优化畅想(三)---- 其他方法&结语的更多相关文章

  1. C# 内存管理优化畅想----前言

    C#语法简洁.优雅,类库丰富,是我最喜爱的计算机语言,没有“之一”.但是,经过深入学习后发现,C#的内存管理,也就是通常所说的垃圾回收(GC)机制,虽然跟其他支持GC的语言相比,已经很优秀了,但与手动 ...

  2. C# 内存管理优化畅想(二)---- 巧用堆栈

    这个优化方法比较易懂,就是对于仅在方法内部用到的对象,不再分配在堆上,而是直接在栈上分配,方法结束后立即回收,这将大大减轻GC的压力. 其实,这个优化方法就是java里的逃逸分析,不知为何.net里没 ...

  3. C# 内存管理优化畅想(一)---- 大对象堆(LOH)的压缩

    我们都知道,.net的GC是不会压缩大对象堆的,因为其时间开销不可接受,但这是以大对象堆产生大块碎片为代价的,如果以后要分配的大对象比最大的碎片还大,那么即使它比所有碎片的总大小要小,也是无法在不扩展 ...

  4. LWJGL3的内存管理,第三篇,剩下的两种策略

    LWJGL3的内存管理,第三篇,剩下的两种策略 上一篇讨论的基于 MemoryStack 类的栈上分配方式,是效率最高的,但是有些情况下无法使用.比如需要分配的内存较大,又或许生命周期较长.这时候就可 ...

  5. C# 内存管理优化实践

    内存优化畅想系列文章已经结束了,很多读者读完之后可能觉得“然并卵”,毕竟都是给微软提的建议而已,现在都没有实现.那么为了优化内存,有没有什么我们现在就能用的技巧呢?我的答案是:有.网上关于.net内存 ...

  6. Objective-C 【在手动内存管理中如何写set方法】

    ------------------------------------------- set方法的内存管理 代码: #import <Foundation/Foundation.h> @ ...

  7. EasyDarwin开源流媒体服务器内存管理优化

    -本文由EasyDarwin开源团队成员Fantasy贡献 前言 最近在linux上跑EasyDarwin发现一个很奇怪的问题,当有RTSPSession连接上来的时候,发现进程的虚拟内存映射一下就多 ...

  8. oc45--多对象内存管理 优化

    // // main.m // Set方法的内存管理 #import <Foundation/Foundation.h> #import "Person.h" #imp ...

  9. 你必须了解的java内存管理机制(三)-垃圾标记

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...

随机推荐

  1. Learning LexRank——Graph-based Centrality as Salience in Text Summarization(一)

    (1)What is Sentence Centrality and Centroid-based Summarization ? Extractive summarization works by ...

  2. 0x1L

    整形常量的后缀表示其类型,包括如下后缀,其中U和L的大小写通用 后缀        类型L           long int LL         long long int U          ...

  3. DJANGO不同应用之间的用户迁移

    因为重新规划新的项目,数据库表结构和以前不一定了,但是想保存以前的很多用户认证方面的东东. 于是看了一下DJANGO的导入导出功能. ~~~~~~~~~~~~~~~~~~~ 数据导入: python ...

  4. java中的日期格式

    时间日期标识符: yyyy:年 MM:月 dd:日 hh:~12小时制(-) HH:24小时制(-) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期(会把这个月总 ...

  5. JSch - Java实现的SFTP(文件上传详解篇)(转)

    JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到 ...

  6. leetcode面试准备:Count Complete Tree Nodes

    1 题目 Given a complete binary tree, count the number of nodes. In a complete binary tree every level, ...

  7. 查看linux内存、cpu

    1.查看cpu数 多核cpu,包括物理多核和逻辑多核,一台机器可能有多个cpu,每个cpu可能有多核的,多个可能包括物理多核和逻辑多核. /proc/cpuinfo 文件里记录了这些信息,以下是一个核 ...

  8. VS2012中启动性能分析 独占样本数的分析

    http://www.cnblogs.com/TianFang/archive/2012/11/18/2776266.html

  9. Unity3d 真实的植物渲染

    好久没写shader了,有些生疏,刚弄了个植物shader,分享一下. 先上图片: 重点需要注意的是fragment shader的透明部分 需要如此声明 Tags{ "LightMode& ...

  10. 像素,分辨率,PPI(像素密度),BPP 扫盲

    像素于分辨率 像素,又称画素,为图像显示的基本单位,译自英文“pixel”,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示“图像元素”之 ...