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) ...
随机推荐
- bzoj 3624: [Apio2008]免费道路 生成树的构造
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 111 Solved: 4 ...
- Contest20140710 eagleeggs
eagleeggs|eagleeggs.in|eagleeggs.out 题目描述: 共有N个硬度相同的鹰蛋,硬度是一个整数(并且已知其不大于H),表示这个蛋从天上掉下来不摔碎的最大高度.为了找出这个 ...
- Android 两个Activity进行数据传送 发送
Activity1:: Intent intent= new Intent(this, OtherActivity.class); String name = "heyiyong" ...
- Android SmartImageView框架的简单实用
特征:根据URL地址装载图像:支持装载通讯录中的图像:支持异步装载:支持缓存: 这个是作者的项目主页,有使用方法.http://loopj.com/android-smart-image-view/ ...
- 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- Linux下高效编写Shell——shell特殊字符汇总
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...
- Delphi 用Web App Debugger简单调试ISAPI 转
用Web App Debugger简单调试ISAPI 以isapi为例: 1.新建一个project,用isapi/nsapi: 2.remove这个project中所有的unit: 3.加进你用 ...
- 【转】VSync Count 垂直同步
原文:http://blog.csdn.net/yesy10/article/details/7794556 Unity3D中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间.一直 ...
- Oracle LOB
Oracle LOB Oracle .NET Framework 数据提供程序包括 OracleLob 类,该类用于使用 Oracle LOB 数据类型. OracleLob 可能是下列 Oracle ...
- effective C++ 读后笔记
首先不得不说侯捷翻译的书大部分我都很喜欢,因为侯捷本身是一名出色的C++技术专家.这本书讲的是C++如何高效的运行,我想要成为一名卓越的开发人员,代码的高效性是必不可少的.很多人的代码质量很差,即使能 ...